SQL实现LeetCode(197.上升温度)


Posted in MySQL onAugust 07, 2021

[LeetCode] 197.Rising Temperature 上升温度

Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to its previous (yesterday's) dates.

+---------+------------+------------------+
| Id(INT) | Date(DATE) | Temperature(INT) |
+---------+------------+------------------+
|       1 | 2015-01-01 |               10 |
|       2 | 2015-01-02 |               25 |
|       3 | 2015-01-03 |               20 |
|       4 | 2015-01-04 |               30 |
+---------+------------+------------------+

For example, return the following Ids for the above Weather table:

+----+
| Id |
+----+
|  2 |
|  4 |
+----+

这道题给了我们一个Weather表,让我们找出比前一天温度高的Id,由于Id的排列未必是按顺序的,所以我们要找前一天就得根据日期来找,我们可以使用MySQL的函数Datadiff来计算两个日期的差值,我们的限制条件是温度高且日期差1,参见代码如下: 

解法一:

SELECT w1.Id FROM Weather w1, Weather w2
WHERE w1.Temperature > w2.Temperature AND DATEDIFF(w1.Date, w2.Date) = 1;

下面这种解法我们使用了MySQL的TO_DAYS函数,用来将日期换算成天数,其余跟上面相同:

解法二:

SELECT w1.Id FROM Weather w1, Weather w2
WHERE w1.Temperature > w2.Temperature AND TO_DAYS(w1.Date) = TO_DAYS(w2.Date) + 1;

我们也可以使用Subdate函数,来实现日期减1,参见代码如下:

解法三:

SELECT w1.Id FROM Weather w1, Weather w2
WHERE w1.Temperature > w2.Temperature AND SUBDATE(w1.Date, 1) = w2.Date;

最后来一种完全不一样的解法,使用了两个变量pre_t和pre_d分别表示上一个温度和上一个日期,然后当前温度要大于上一温度,且日期差为1,满足上述两条件的话选出来为Id,否则为NULL,然后更新pre_t和pre_d为当前的值,最后选出的Id不为空即可:

解法四:

SELECT Id FROM (
SELECT CASE WHEN Temperature > @pre_t AND DATEDIFF(Date, @pre_d) = 1 THEN Id ELSE NULL END AS Id,
@pre_t := Temperature, @pre_d := Date 
FROM Weather, (SELECT @pre_t := NULL, @pre_d := NULL) AS init ORDER BY Date ASC
) id WHERE Id IS NOT NULL;

参考资料:

https://leetcode.com/discuss/33641/two-solutions

https://leetcode.com/discuss/52370/my-simple-solution-using-inner-join

https://leetcode.com/discuss/86435/a-simple-straightforward-solution-and-its-very-fast

到此这篇关于SQL实现LeetCode(197.上升温度)的文章就介绍到这了,更多相关SQL实现上升温度内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL连接挂死的原因
May 18 MySQL
MySQL触发器的使用
May 24 MySQL
52条SQL语句教你性能优化
May 25 MySQL
MySQL中distinct与group by之间的性能进行比较
May 26 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
SQL实现LeetCode(196.删除重复邮箱)
Aug 07 #MySQL
MySQL Shell import_table数据导入的实现
Aug 07 #MySQL
MySQL配置主从服务器(一主多从)
SQL实现LeetCode(180.连续的数字)
Aug 04 #MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 #MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 #MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 #MySQL
You might like
再说下636单管机
2021/03/02 无线电
php单件模式结合命令链模式使用说明
2008/09/07 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
php表单处理操作
2017/11/16 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
javascript读写json示例
2014/04/11 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
swiper实现导航滚动效果
2020/12/13 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
numpy自动生成数组详解
2017/12/15 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
重点工程汇报材料
2014/08/27 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
技术股东合作协议书
2014/12/02 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
婚宴新娘致辞
2015/07/28 职场文书
Redis主从复制操作和配置详情
2022/09/23 Redis