Oracle中如何统计多行连续日期的连续天数(无法使用DATEDIFF)
Oracle数据库统计连续日期天数
需求:在Oracle数据库中统计连续日期的天数,连续日期需合并为一行,显示该连续段的起始日期和连续天数。例如当存在01-MAY-25、02-MAY-25、03-MAY-25这三条数据时,需返回一行以01-MAY-25为起始日期、连续天数为3的结果。
原始数据表
| ID | X_DATE |
|---|---|
| 1 | 01-MAY-25 |
| 2 | 02-MAY-25 |
| 3 | 03-MAY-25 |
| 4 | 11-MAY-25 |
| 5 | 21-MAY-25 |
| 6 | 22-MAY-25 |
| 7 | 25-MAY-25 |
| 8 | 27-MAY-25 |
| 9 | 28-MAY-25 |
期望结果
| ID | X_DATE | NUM_DAYS |
|---|---|---|
| 1 | 01-MAY-25 | 3 |
| 4 | 11-MAY-25 | 1 |
| 5 | 21-MAY-25 | 2 |
| 7 | 25-MAY-25 | 1 |
| 8 | 27-MAY-25 | 2 |
注:Oracle数据库不支持DATEDIFF函数,需使用Oracle原生语法实现。
解决方案
使用Oracle窗口函数实现连续日期分组统计,SQL语句如下:
WITH date_groups AS ( SELECT ID, X_DATE, -- 生成分组标识:连续日期的X_DATE减去行号后值一致 X_DATE - ROW_NUMBER() OVER (ORDER BY X_DATE) AS group_id FROM your_table_name -- 替换为实际表名 ) SELECT MIN(ID) AS ID, MIN(X_DATE) AS X_DATE, COUNT(*) AS NUM_DAYS FROM date_groups GROUP BY group_id ORDER BY X_DATE;
逻辑说明
- 分组标识生成:利用
ROW_NUMBER()按日期排序生成递增行号,连续日期减去对应行号后会得到相同的group_id,非连续日期则生成不同的group_id,以此区分不同的连续日期段。 - 聚合统计:按
group_id分组后,取每组最小的ID(对应连续段的第一条数据ID)、最小的日期(连续段起始日期),统计每组的行数即为该段的连续天数。 - 排序输出:最终按起始日期排序,保证结果顺序符合预期。
内容的提问来源于stack exchange,提问作者The Guest
相关产品推荐
相关产品推荐

