题目描述

(通过次数145,680 | 提交次数270,246,通过率53.91%)

表: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)
链接:https://leetcode.cn/problems/rising-temperature
//测试数据
Create table If Not Exists Weather (id int, recordDate date, temperature int);

insert into Weather (id, recordDate, temperature) values ('1', '2015-01-01', '10');
insert into Weather (id, recordDate, temperature) values ('2', '2015-01-02', '25');
insert into Weather (id, recordDate, temperature) values ('3', '2015-01-03', '20');
insert into Weather (id, recordDate, temperature) values ('4', '2015-01-04', '30');

解题思路

题目要求,今天的温度与昨天相比,把今天比昨天高的天返回。

比较直观的考虑是直接使用自关联,取出每天的前一天的温度,再比较返回即可。

比如:

select
    a.id
from Weather a
inner join Weather b
on date_sub(a.recordDate,interval 1 day) = b.recordDate
and a.temperature > b.temperature;

上面的写法,简洁直观好理解。

但今天强哥介绍另一种思路:使用lag分析函数。

lag(recordDate,1) over(order by recordDate)

有了上一个日期以及上一个日期的温度,再与当日日期及温度比较即可得出结果。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    b.id
from (
select
    a.id,
    a.recordDate,
    a.temperature,
    lag(a.recordDate,1) over(order by a.recordDate) as pre_recordDate,
    lag(a.temperature,1) over(order by a.recordDate) as pre_temperature
from Weather a
) b
where date_sub(b.recordDate,interval 1 day) = b.pre_recordDate
  and b.temperature > b.pre_temperature;
picture loss