Oracle数据库中基于检查点的自定义数据分组方案咨询
实现思路
你需要的是按Unique值作为边界切分连续的Typical值,属于典型的序列区间划分问题,用Oracle自带的累积求和分析函数就能完成边界标记,不需要依赖上一行的case计算结果:
- 先按时间排序所有记录,每遇到一条
Unique-Value-xxx的记录就给分组标记加1,其余Typical记录的分组标记和前一行保持一致 - 按分组标记+值类型聚合,连续的Typical记录取组内最早时间,Unique记录单独保留即可
完整SQL代码
WITH boundary_mark AS ( SELECT DATE, MIXED_NAME, -- 遇到Unique值就计数+1,作为分组边界 SUM(CASE WHEN MIXED_NAME LIKE 'Unique-Value%' THEN 1 ELSE 0 END) OVER (ORDER BY DATE) AS group_id FROM 你的表名 ) SELECT MIN(DATE) AS DATE, CASE WHEN MIXED_NAME LIKE 'Unique-Value%' THEN MIXED_NAME ELSE 'Typical-Value' END AS MIXED_NAME FROM boundary_mark GROUP BY group_id, CASE WHEN MIXED_NAME LIKE 'Unique-Value%' THEN MIXED_NAME ELSE 'Typical-Value' END ORDER BY DATE
结果说明
运行上述SQL后,输出结果和你提供的预期逻辑完全匹配:
- 开头所有未遇到任何Unique值的连续Typical记录会合并为1条,保留最早时间
- 每个Unique值单独作为1条记录保留
- 两个Unique值之间的连续Typical记录会合并为1条,保留该区间最早的时间
注:你提供的预期结果里第三个Typical-Value的时间为December 15, 2013 at 11:00:00 PM属于笔误,按原始数据该区间最早的Typical记录时间为December 25, 2013 at 1:31:13 AM,实际运行会以原始数据为准。如果DATE字段存在重复值,可在ORDER BY后补充唯一行标识避免排序不稳定
内容的提问来源于stack exchange,提问作者Cosmic Thing
相关产品推荐
相关产品推荐

