197. 上升的温度

233 阅读2分钟

一、题目

表: 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 -> 252015-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;

image.png

三、执行语句

执行结果

image.png

四、总结

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

image.png

DATEDIFF在一些文档上还有一个参数是数据格式,但是在写的过程中,似乎是不行的,后边在瞅瞅。