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 07 MySQL
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
mysql如何配置白名单访问
Jun 30 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
一文搞懂MySQL索引页结构
Feb 28 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MYSQL如何查看操作日志详解
May 30 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
默默简单的写了一个模板引擎
2007/01/02 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
python去掉字符串中重复字符的方法
2014/02/27 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
python调用外部程序的实操步骤
2019/03/04 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
python mock测试的示例
2020/10/19 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
python实现简单的学生管理系统
2021/02/22 Python
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
大学生职业生涯规划书模板
2014/01/03 职场文书
房地产还款计划书
2014/01/10 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
小学生综合素质评语
2014/04/23 职场文书
工商管理自荐书
2014/07/06 职场文书
表扬信格式模板
2015/05/05 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
Python 阶乘详解
2021/10/05 Python
SQL中的连接查询详解
2022/06/21 SQL Server