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命令行操作时的编码问题详解
Apr 14 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 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
PHP禁止页面缓存的代码
2011/10/23 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
canvas实现钟表效果
2017/02/13 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python3音乐播放器简单实现代码
2020/04/20 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
Python super()方法原理详解
2020/03/31 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
考核评语大全
2014/04/29 职场文书
带病坚持工作事迹
2014/05/03 职场文书
临床医学专业求职信
2014/08/08 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
警告通知
2015/04/25 职场文书
安全生产会议制度
2015/08/06 职场文书
校长新学期寄语2016
2015/12/04 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
浅谈MySQL之select优化方案
2021/08/07 MySQL
vue实现拖拽交换位置
2022/04/07 Vue.js