【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;

相关文章
相关标签/搜索