問題:函數
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;