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 13 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
MySQL 四种连接和多表查询详解
Jul 16 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
Mysql中常用的join连接方式
May 11 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySql统计函数COUNT的具体使用详解
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
PHP 模拟$_PUT实现代码
2010/03/15 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
Python牛刀小试密码爆破
2011/02/03 Python
python列表与元组详解实例
2013/11/01 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python基于DES算法加密解密实例
2015/06/03 Python
Python中的下划线详解
2015/06/24 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
Sanic框架应用部署方法详解
2018/07/18 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
中学生差生评语
2014/01/30 职场文书
早会主持词
2014/03/17 职场文书
婚前协议书范本
2014/04/15 职场文书
战略合作意向书
2014/07/29 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
论文答谢词
2015/01/20 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
正确使用MySQL update语句
2021/05/26 MySQL