SQL 上升的温度

197 上升的温度

SQL架构
表: Weather

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| id | int |
| recordDate | date |
| temperature | int |
±--------------±--------+
id 是这个表的主键
该表包含特定日期的温度信息

编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。

返回结果 不要求顺序 。

查询结果格式如下例。

示例 1:

输入:
Weather 表:
±—±-----------±------------+
| id | recordDate | Temperature |
±—±-----------±------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
±—±-----------±------------+
输出:
±—+
| id |
±—+
| 2 |
| 4 |
±—+
解释:
2015-01-02 的温度比前一天高(10 -> 25)
2015-01-04 的温度比前一天高(20 -> 30)

解决方案:

提供思路

如同之前的思路,该表join自身一次(cross join 笛卡尔集,详细可以百度查询),筛选条件。由于不同的sql有类似的语法,下面写出相关语法。

上代码:

//1
select a.id
from weather as a cross join weather as b 
     on datediff(a.recordDate, b.recordDate) = 1
where a.Temperature  > b.Temperature ;

//2
select a.id
from weather as a cross join weather as b 
     on timestampdiff(day, a.recordDate , b.recordDate ) = -1
where a.Temperature  > b.Temperature ;

以上是碰到的第一百九十七题,后续持续更新。感觉对你有帮助的小伙伴可以帮忙点个赞噢!

在这里插入图片描述

### 如何在 HiveSQL 中使用时间作为条件进行数据筛选 #### 使用 `unix_timestamp` 函数转换时间和字符串 为了方便处理时间字段,在 HiveSQL 中可以利用 `unix_timestamp` 函数将特定格式的时间串转化为 Unix 时间戳,从而简化比较操作。例如: ```sql SELECT * FROM your_table WHERE unix_timestamp(time_column, 'yyyy-MM-dd HH:mm:ss') >= unix_timestamp('2011-12-07 13:01:03', 'yyyy-MM-dd HH:mm:ss'); ``` 此语句会选取表中所有记录其 `time_column` 字段表示的时间晚于等于给定的具体时刻的数据[^2]。 #### 利用日期函数直接对比日期列 当涉及到两个日期之间的差距计算时,可以直接运用内置的日期差函数如 `DATEDIFF()` 来实现相邻两天温度变化情况下的天气ID提取案例中的逻辑: ```sql WITH weather_data AS ( SELECT id, temperature, recordDate, LAG(temperature) OVER (ORDER BY recordDate) AS prev_temp, LAG(recordDate) OVER (ORDER BY recordDate) AS prev_date FROM Weather ) SELECT id FROM weather_data WHERE temperature > prev_temp AND DATEDIFF(recordDate, prev_date) = 1; ``` 这里通过窗口函数 `LAG()` 获取前一天的信息并结合 `DATEDIFF()` 实现了一日内气温上升站点编号的选择[^1]。 对于更复杂的场景比如查找连续几天内有活动行为的用户群体,可以通过自定义间隔来构建分组依据,如下所示: ```sql WITH user_activity AS ( SELECT user_id, dt, COALESCE(DATEDIFF(dt, LAG(dt) OVER (PARTITION BY user_id ORDER BY dt)), 0) AS day_gap FROM activity_log ), grouped_users AS ( SELECT *, SUM(CASE WHEN day_gap > 2 OR day_gap IS NULL THEN 1 ELSE 0 END) OVER (PARTITION BY user_id ORDER BY dt) AS group_id FROM user_activity ) -- 继续后续分析... ``` 上述代码片段展示了如何基于用户的活跃日志创建新的分组标识符 `group_id` ,每当遇到超过两天无动作的情况就会增加一个新的分组号[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值