题目描述
(通过次数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;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。