详解力扣高频SQL50题之197. 上升的温度【简单】

传送门:197. 上升的温度

题目

表: Weather

±--------------±--------+

| Column Name | Type |

±--------------±--------+

| id | int |

| recordDate | date |

| temperature | int |

±--------------±--------+

id 是该表具有唯一值的列。

没有具有相同 recordDate 的不同行。

该表包含特定日期的温度信息

编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 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)

解析

本题不难,但是有坑点:如果日期是连续的,那么用位移开窗函数lead()或lag()是方便的,但是这题没有说日期是连续的,所以用开窗函数不一定能通过。事实上,涉及同一列的值相互比较,要想到用自连接,这样就可以保证同一行的日期在另一张表中相差一天,即on 表1.date=表2.date-1,这样两张表就分为今天表和昨天表,那么只需判断今天表的温度是否大于昨天表即可,最后注意返回今天表的id。

算法(标准SQL)

自连接天气表,令表1的日期-1=表2的日期,这样表1就成为今天表,表2就成为昨天表,再判断表1的温度是否大于昨天表,最后返回表1的id即可。

代码(标准SQL)

sql 复制代码
select w1.id as id
from Weather w1
join Weather w2
on w1.recordDate-1=w2.recordDate
where w1.Temperature>w2.Temperature;
相关推荐
ProcessOn8 小时前
纯干货!MySql实战02:一条SQL更新语句执行流程大探索!
sql·mysql·sql server
geovindu12 小时前
sql: JSON and XML Data Handling in SQL using mysql 9.0
数据库·sql·mysql·数据库开发
泡海椒13 小时前
JQuick-SQL SELECT 投影:字段、别名与表达式查询
数据库·sql
Nil20813 小时前
leetcode 49字母异位分组
算法·leetcode·哈希算法
猫咪很可爱13 小时前
mysqldump 失败常见场景
数据库·sql·mysql
LMT流氓兔13 小时前
第四单元——第17课:让回答边生成、边显示
服务器·数据库·人工智能·python·oracle·langchain
其实防守也摸鱼13 小时前
Linux文本处理命令理论学习
linux·服务器·前端·数据库·sql·学习·安全
IM架构师14 小时前
# 一次老旧PHPCMS网站入侵排查:从SQL注入到PHP后门,以及IP白名单止血
sql·tcp/ip·php
kyle~14 小时前
DTO --- 数据封装
数据库·oracle·前后端
Lethehong1 天前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle