题目描述
给定一个Weather
表,编写一个 SQL
查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+---------+------------------+------------------+
例如,根据上述给定的Weather
表格,返回如下 Id
:
+----+
| Id |
+----+
| 2 |
| 4 |
+----+
算法设计与分析:
本题主要考查join
和DATEDIFF
子句的使用,后者的意思明显就是:日期差异
由于个人少用DATEDIFF
子句,所以这里写一写它的用法:
在MySQL中经常使用DATEDIFF
来比较两个日期的类型的值。在Oracle里面没有。
DATEDIFF()函数的具体原理如下:
# 计算给出的日期的差值
DATEDIFF('2019-7-31','2019-8-1'); # 前-后-->-1
DATEDIFF('2019-8-2','2019-8-1'); # 前-后-->1
根据题意可以知道,待查查询的满足条件有两个:
- 1、与前面的日期的差值为1
- 2、比前面一天的温度高
使用join和datediff子句:
select
a.Id
from
Weather as a # 不加as的话效率会变慢
join
Weather as b
on
a.Temperature > b.Temperature
and
dateDiff(a.RecordDate,b.RecordDate) = 1
取一个别名的情况:
SELECT
Weather.Id
FROM
Weather
JOIN
Weather as w
ON
DATEDIFF(Weather.RecordDate, w.RecordDate) = 1
AND
Weather.Temperature > w.Temperature
;
使用where的情况:
# Write your MySQL query statement below
SELECT
a.Id
FROM
Weather as a,
Weather as b
where
DATEDIFF(a.RecordDate, b.RecordDate) = 1
AND
a.Temperature > b.Temperature
;
总结:
- 1、不同其他的编程语言,sql值的判断直接使用
=
号 - 2、Weather as a # 不加as的话效率会变慢
- 3、join和on搭配
- 4、where单独使用。