【sql】統計溫度比前一天高的id 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.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;

相關文章
相關標籤/搜索