一、题目
表: Weather
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| recordDate | date |
| temperature | int |
+---------------+---------+
id 是这个表的主键
该表包含特定日期的温度信息
编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。
返回结果 不要求顺序 。
查询结果格式如下例。
示例 1:
输入:
Weather 表:
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+----+------------+-------------+
输出:
+----+
| id |
+----+
| 2 |
| 4 |
+----+
解释:
2015-01-02 的温度比前一天高(10 -> 25)
2015-01-04 的温度比前一天高(20 -> 30)
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/ri…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
创建数据表,并设置主键填充字段
CREATE TABLE Weather(
id INT PRIMARY KEY,
recordDate DATE,
temperature INT
);
INSERT INTO Weather VALUES
(1,'2015-01-01',10),
(2,'2015-01-02',25),
(3,'2015-01-03',20),
(4,'2015-01-04',30);
解题
根据题意要来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。从这句话得到两个信息,第一个信息要找每个昨天和今天的温度信息,第二个信息是,昨天的温度要比低于今天的温度。
- 查找时间相隔为1天的数据
- 在查找的基础上判断两个数据,第一个要小于第二个
- 将数据输出出来
SELECT w1.id Id FROM Weather w1 CROSS
JOIN Weather w2 ON DATEDIFF(w1.recordDate,w2.recordDate) = 1
AND w1.temperature > w2.temperature;
三、执行语句
执行结果
四、总结
CROSS JOIN ON
交叉连接查询,CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积,通过比较,将满足条件的数据集筛选出来。也可以筛选通一张表,可以设置不同的假名
SELECT w1.id Id FROM Weather w1 CROSS
JOIN Weather w2 ON [条件]
DATEDIFF
DATEDIFF: 返回两个日期之间的时间间隔
例子
SELECT DATEDIFF('2001-01-02', '2001-01-01') AS Result
DATEDIFF在一些文档上还有一个参数是数据格式,但是在写的过程中,似乎是不行的,后边在瞅瞅。