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

+---------+------------+------------------+
| 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:

+----+
| Id |
+----+
|  2 |
|  4 |
+----+

解决:

① 给定一个Weather表,找出比前一天温度高的Id,由于Id的排列未必是按顺序的,所以我们要找前一天就得根据日期来找,我们可以使用MySQL的函数Datediff来计算两个日期的差值,我们的限制条件是温度高且日期差1。1778ms

SELECT w1.Id FROM Weather w1,Weather w2
WHERE w1.Temperature > w2.Temperature AND DATEDIFF(w1.Date,w2.Date) = 1;

② 使用了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;

③ 可以使用Subdate函数,来实现日期减1。 1336 ms

SELECT w1.Id FROM Weather w1,Weather w2
WHERE w1.Temperature > w2.Temperature AND SUBDATE(w1.Date,1) = w2.Date;

④ 用了两个变量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;

 

转载于:https://my.oschina.net/liyurong/blog/1572829

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值