当前位置: 首页 > article >正文

SQL-leetcode-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)

题解

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_date
    from 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_id
    from 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
在这里插入图片描述


http://www.kler.cn/a/465352.html

相关文章:

  • 电脑里msvcr120.dll文件丢失怎样修复?
  • Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost对比...
  • pytorch镜像源
  • Postgresql 命令还原数据库
  • vue——滑块验证
  • 开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频
  • Day 20:日志管理与 Logback
  • Go语言在实际项目中的应用:从RESTful API到日志监控 (十四)
  • wordpress右侧浮动咨询台插件
  • 频域滤波为什么使用psf2otf函数?
  • 大语言模型(LLMs)数学推理的经验技巧【思维链CoT的应用方法】
  • 【JavaWeb后端学习笔记】MySQL的常用函数(字符串函数,数值函数,日期函数,流程函数)
  • Java学习-Redis
  • Next.js 实战 (六):如何实现文件本地上传
  • 目录中只有一个子目录时把子目录移动到父目录
  • OpenCV的人脸检测模型FaceDetectorYN
  • 25考研王道数据结构课后习题笔记
  • 2025三掌柜赠书活动第一期:动手学深度学习(PyTorch版)
  • 什么是实体完整性约束?
  • CSS系列(43)-- Anchor Positioning详解
  • Python图形界面(GUI)Tkinter笔记(二十二):Listbox列表项目功能控件
  • 在C#中获取程序的命令行参数
  • Spring MVC 的@GetMapping和@PostMapping和@PutMapping
  • Maven项目集成SQL Server的完整教程:从驱动配置到封装优化
  • Unity小白工作心得(无限记录)
  • uniapp中使用ruoyiPlus中的加密使用(crypto-js)