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