如何创建含重复值的ROW_NUMBER列?SQL实现问询
解决方案:生成随布尔值动态变化的连续序号
要实现当column_bool为TRUE时生成连续序列号,为FALSE时复用前一行序号的需求,可以通过累计求和分组的方式实现,核心思路是先标记出所有需要递增序号的行,再通过窗口函数累计这些标记,自动为FALSE行继承前序序号。
正确SQL实现
SELECT column_id, column_bool, SUM(CASE WHEN column_bool THEN 1 ELSE 0 END) OVER (ORDER BY column_id) AS dynamic_id FROM t1 ORDER BY column_id;
执行结果验证
针对你的测试表,执行后会得到如下符合预期的结果:
| column_id | column_bool | dynamic_id |
|---|---|---|
| 1 | true | 1 |
| 2 | true | 2 |
| 3 | false | 2 |
| 4 | true | 3 |
| 5 | true | 4 |
| 6 | true | 5 |
| 7 | false | 5 |
| 8 | true | 6 |
逻辑说明
- 标记递增触发行:用
CASE WHEN column_bool THEN 1 ELSE 0 END将TRUE行标记为1,FALSE行标记为0。 - 累计求和生成序号:通过
SUM() OVER (ORDER BY column_id)按column_id顺序累计这些标记值。每当遇到TRUE行,累计值加1;遇到FALSE行,累计值保持不变,自然继承了前一行的序号。
原代码问题分析
你之前的代码使用PARTITION BY column_bool会把TRUE和FALSE行分成两个独立分组,导致FALSE行的序号是单独计数后减1,无法关联到前一行的正确序号,所以不符合预期。
内容的提问来源于stack exchange,提问作者Watermln
相关产品推荐
相关产品推荐

