题目描述

(通过次数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
表: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
表: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');
//测试数据 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');
//测试数据
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;
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;
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)
lag(recordDate,1) over(order by recordDate)
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;
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;
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