问题:函数
Given a Weather
table, write a SQL query to find all dates' Ids with higher temperature compared to its previous (yesterday's) dates.spa
+---------+------------+------------------+ | 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:code
+----+ | Id | +----+ | 2 | | 4 | +----+
解决:it
① 给定一个Weather表,找出比前一天温度高的Id,因为Id的排列未必是按顺序的,因此咱们要找前一天就得根据日期来找,咱们能够使用MySQL的函数Datediff来计算两个日期的差值,咱们的限制条件是温度高且日期差1。1778msio
SELECT w1.Id FROM Weather w1,Weather w2
WHERE w1.Temperature > w2.Temperature AND DATEDIFF(w1.Date,w2.Date) = 1;table
② 使用了MySQL的TO_DAYS函数,用来将日期换算整天数,其他跟上面相同:1851ms。变量
SELECT w1.Id FROM Weather w1,Weather w2
WHERE w1.Temperature > w2.Temperature AND TO_DAYS(w1.Date) = TO_DAYS(w2.Date) + 1;date
③ 能够使用Subdate函数,来实现日期减1。 1336 mstab
SELECT w1.Id FROM Weather w1,Weather w2
WHERE w1.Temperature > w2.Temperature AND SUBDATE(w1.Date,1) = w2.Date;di
④ 用了两个变量pre_t和pre_d分别表示上一个温度和上一个日期,而后当前温度要大于上一温度,且日期差为1,知足上述两条件的话选出来为Id,不然为NULL,而后更新pre_t和pre_d为当前的值,最后选出的Id不为空便可。1460 ms
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;