编写SQL查询以获取rate在指定日期间未发生变化的连续时段数据
连续未变化rate时段查询语句
适用范围
支持所有支持标准SQL窗口函数的数据库(MySQL 8.0+、PostgreSQL、Oracle、SQL Server等)
查询代码
WITH diff_mark AS ( SELECT date, rate, -- 标记当前行rate和上一行是否不同,不同则打标1 CASE WHEN rate != LAG(rate, 1) OVER (ORDER BY date) THEN 1 ELSE 0 END AS is_diff FROM 替换为你的实际表名 ), group_calc AS ( SELECT date, rate, -- 累加标记得到分组ID,相同分组内为连续相同rate的记录 SUM(is_diff) OVER (ORDER BY date) AS group_id FROM diff_mark ) SELECT MIN(date) AS startdate, MAX(date) AS enddate, rate FROM group_calc GROUP BY group_id, rate ORDER BY startdate;
逻辑说明
- 第一步通过
LAG窗口函数获取按日期排序后上一行的rate值,和当前行对比,不同则标记为1,相同标记为0 - 第二步对标记值做累加求和,得到分组ID,每次rate变化时分组ID就会+1,保证连续相同rate的记录分到同一个组
- 最后按分组ID和rate聚合,取每组最小日期为区间起始日期,最大日期为区间结束日期即可
样例验证
输入数据
| date | rate |
|---|---|
| 2014-09-18 | 270 |
| 2014-09-19 | 270 |
| 2014-09-20 | 310 |
| 2014-09-21 | 310 |
| 2014-09-22 | 310 |
| 2014-09-23 | 320 |
| 2014-09-24 | 310 |
| 2014-09-25 | 320 |
| 2014-09-26 | 270 |
输出结果
| startdate | enddate | rate |
|---|---|---|
| 2014-09-18 | 2014-09-19 | 270 |
| 2014-09-20 | 2014-09-22 | 310 |
| 2014-09-23 | 2014-09-23 | 320 |
| 2014-09-24 | 2014-09-24 | 310 |
| 2014-09-25 | 2014-09-25 | 320 |
| 2014-09-26 | 2014-09-26 | 270 |
内容的提问来源于stack exchange,提问作者Murali Uppara
相关产品推荐
相关产品推荐

