Oracle SQL值变化递增逻辑与SUM开窗函数计算原理疑问
你使用的是带ORDER BY子句的SUM()窗口函数,它在指定分区内默认执行逐行累积求和,计算范围是分区内从第一行到当前行的所有gap值的和。
我们先把你内层查询得到的gap值逐行列出来,再对应计算grp:
| 序号 | person | day | flag | gap | grp计算逻辑 | grp结果 |
|---|---|---|---|---|---|---|
| 1 | person1 | day1 | Y | 1 | 仅当前行,和为1 | 1 |
| 2 | person1 | day2 | Y | 0 | 前1行gap和 + 当前gap = 1+0=1 | 1 |
| 3 | person1 | day3 | Y | 0 | 前2行gap和 + 当前gap = 1+0=1 | 1 |
| 4 | person1 | day4 | N | 1 | 前3行gap和 + 当前gap = 1+1=2 | 2 |
| 5 | person1 | day5 | N | 0 | 前4行gap和 + 当前gap = 2+0=2 | 2 |
| 6 | person1 | day6 | Y | 1 | 前5行gap和 + 当前gap = 2+1=3 | 3 |
| 7 | person1 | day7 | Y | 0 | 前6行gap和 + 当前gap = 3+0=3 | 3 |
| 8 | person1 | day8 | Y | 0 | 前7行gap和 + 当前gap = 3+0=3 | 3 |
这种写法是SQL中解决「连续数据分组(孤岛问题)」的标准方案:相同grp值的行就是连续的、flag取值相同的一组数据,后续你可以直接按person和grp分组,统计每组的开始/结束时间、连续天数等指标。
内容的提问来源于stack exchange,提问作者FreshTransistor
相关产品推荐
相关产品推荐

