LeetCodeSQL专项计划:197. 上升的温度

39 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

难度评分

难度评分:⭐

题目

197. 上升的温度

Create Table & Insert

-- ----------------------------
-- Table structure for weather
-- ----------------------------
DROP TABLE IF EXISTS `weather`;
CREATE TABLE `weather`  (
  `id` int(10) NULL DEFAULT NULL,
  `recordDate` date NULL DEFAULT NULL,
  `temperature` int(10) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of weather
-- ----------------------------
INSERT INTO `weather` VALUES (1, '2015-01-01', 10);
INSERT INTO `weather` VALUES (2, '2015-01-02', 25);
INSERT INTO `weather` VALUES (3, '2015-01-03', 20);
INSERT INTO `weather` VALUES (4, '2015-01-04', 30);

SQL

SELECT w2.id FROM weather w1 INNER JOIN weather w2 ON DATEDIFF(w2.recordDate,w1.recordDate ) = 1 AND w2.temperature > w1.temperature ORDER BY w1.recordDate,w2.recordDate

备注

这题主要涉及日期的差值操作语句。

注意

日期的差值不可以通过+或者-进行,例如1月31日和2月1日之间,不能用加减1来算。这时候需要用到函数:DATEDIFF(A,B),这个函数的意思是:A日期与B日期的差值,即B到A相差几天。

分析该SQL语句:

我们首先需要比较后一天与前一天的温度值,单表是无法进行该操作的,所以我们想到使用INNER JOIN,并且按照日期进行排序,防止乱序日期影响结果。

  1. SELECT * FROM weather w1 INNER JOIN weather w2 ORDER BY w1.recordDate,w2.recordDate;

我们关注的就是画绿线的行数据

image.png

找出其中的规律,我们需要的是w2.recordDate > w1.recordDate的日期,当然就要刚刚好大于一天的这种,别忘记我们提过的函数DATEDIFF(A,B)就适合筛选出在这种差值为1天的日期;然后呢,我们还需要判断的就是第二天的日期记录的温度还需要大于第一题的温度,那就是w2.temperature > w1.temperature

OK,INNER JOIN的判断放在ON里面,那就是

  1. ON DATEDIFF(w2.recordDate,w1.recordDate ) = 1 AND w2.temperature > w1.temperature

以上就是全部思考过程了。

附录

  1. 当前的时间加一天:SELECT DATE_ADD(CURDATE(),INTERVAL 1 DAY);
  2. 当前时间的昨天:SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);

所以此题还可以这样:

SELECT w2.id FROM weather w1 INNER JOIN weather w2 ON DATE_ADD(w1.recordDate,INTERVAL 1 DAY) =w2.recordDate AND w2.temperature > w1.temperature ORDER BY w1.recordDate,w2.recordDate;

我的LeetCode上验证的是DATE_ADD这种方法比DATEDIFF效率要高。