Oracle中如何用OVER(PARTITION BY)实现分组切换时计数重置
Oracle 连续分组计数及带Colspan的HTML表格实现
正确的窗口函数写法
要实现连续grp分组的行数统计(切换分组时计数重置为1),核心是先识别连续的同一grp组,再基于该组生成计数。可以通过两个ROW_NUMBER()的差值来标记连续分组,具体SQL如下:
SELECT row, grp, pdate, ROW_NUMBER() OVER(PARTITION BY grp, grp_group ORDER BY pdate) AS count FROM ( SELECT row, grp, pdate, -- 计算行号差,相同差值表示连续的同一grp组 ROW_NUMBER() OVER(ORDER BY pdate) - ROW_NUMBER() OVER(PARTITION BY grp ORDER BY pdate) AS grp_group FROM your_table -- 替换为你的表名 ) t ORDER BY pdate;
逻辑说明
- 内层查询中:
ROW_NUMBER() OVER(ORDER BY pdate):按pdate全局生成行号ROW_NUMBER() OVER(PARTITION BY grp ORDER BY pdate):按grp分区后生成行号- 两者的差值
grp_group会为连续的同一grp行分配相同的值,分组切换时差值变化
- 外层查询基于
grp和grp_group分区,用ROW_NUMBER()生成每组内的连续计数,实现分组切换时计数重置为1的效果
带Colspan属性的示例HTML表格
假设原表数据按pdate排序后生成的结果,对应的合并grp列的HTML表格如下:
| row | grp | pdate | COUNT |
|---|---|---|---|
| 1 | A | 2024-01-01 | 1 |
| 2 | 2024-01-02 | 2 | |
| 3 | B | 2024-01-03 | 1 |
| 4 | 2024-01-04 | 2 | |
| 5 | 2024-01-05 | 3 | |
| 6 | A | 2024-01-06 | 1 |
内容的提问来源于stack exchange,提问作者Chami J
相关产品推荐
相关产品推荐

