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)
题解
id 是该表具有唯一值的列。
没有具有相同 recordDate 的不同行。
该表包含特定日期的温度信息
编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id 。
- 连续对比问题如何解?
首选lag、lead偏移函数,lag向上偏移,lead向下偏移,传参要注意,先传递偏移的字段,再传递offset偏移行,最后传递偏移不到数据的默认值,over里面传递分区+排序【多个函数并用以最后一个排序为准】
方法一:lag、lead偏移函数
-- lag向上偏移
select tmp2.id as Id
from (select id,recordDate,Temperature ,lag(Temperature,1,null) over(order by recordDate) as lag_t ,lag(recordDate,1,null) over(order by recordDate) as lag_datefrom Weather
) tmp2 where tmp2.Temperature > tmp2.lag_t
and datediff(tmp2.recordDate,lag_date)=1-- lead向下偏移[稍微麻烦点,建议优先考虑偏移对比的数据]
select tmp2.lead_id as Id
from (select id,recordDate,Temperature ,lead(Temperature,1,null) over(order by recordDate) as lead_t ,lead(recordDate,1,null) over(order by recordDate) as lead_date,lead(id,1,null) over(order by recordDate) as lead_idfrom Weather
) tmp2 where tmp2.Temperature < tmp2.lead_t
and datediff(tmp2.recordDate,lead_date)=-1
PS:可以结合样例思考一下,体会一下窗口函数的排序效果。
看现象是以最后一个窗口函数排序为准,over啥都不写,以默认记录为准
方法二 join
预期是与昨天对比的结果,把昨天的数据和今天的数据拉齐不就ok了吗?
于是乎 怎么拉齐,join呗
join 一下, 把今天和昨天join起来,做下判断即可
select w1.id as Id
from Weather w1 join Weather w2
on w1.recordDate = date_add(w2.recordDate, interval 1 day)
where w1.Temperature > w2.Temperature
date_add 函数
interval 1 day 间隔1天
date_add(xx_date, interval 1 day) – 表示 xx_date+1