如何用ROW_NUMBER和PARTITION为分组内唯一CNS_BID生成BUILD_NUM
解决SQL中按CNS_PID分组为唯一CNS_BID分配连续编号的问题
修正后的SQL代码
SELECT CNS_PID, CNS_BID, DENSE_RANK() OVER(PARTITION BY CNS_PID ORDER BY CNS_BID) AS BUILD_NUM, CNS_SECT_NUM FROM REAL_PROP.CONSTRCOM
问题分析
原代码使用ROW_NUMBER() OVER(PARTITION BY CNS_PID ORDER BY CNS_PID),仅按CNS_PID分区且排序字段无实际区分度,会为每一行分配唯一递增编号,导致同一CNS_BID下的多行BUILD_NUM不统一,无法满足“同一建筑(CNS_BID)共享同一编号”的需求。
方案说明
使用DENSE_RANK()函数可精准实现需求:
PARTITION BY CNS_PID:确保编号在每个CNS_PID组内独立重置ORDER BY CNS_BID:为每个唯一的CNS_BID分配连续排名,同一CNS_BID下的所有行共享相同的BUILD_NUM,编号连续无断层
结果对比
当前非预期结果
| CNS_PID | CNS_BID | BUILD_NUM | CNS_SECT_NUM |
|---|---|---|---|
| 2656 | 2656 | 1 | 1 |
| 2656 | 2656 | 2 | 2 |
| 2656 | 2656 | 3 | 3 |
| 2656 | 170166 | 4 | 1 |
| 2656 | 170166 | 5 | 2 |
| 2656 | 170167 | 6 | 1 |
| 2656 | 170167 | 7 | 2 |
| 2656 | 170168 | 8 | 1 |
| 2656 | 170168 | 9 | 2 |
预期结果(修正后可实现)
| CNS_PID | CNS_BID | BUILD_NUM | CNS_SECT_NUM |
|---|---|---|---|
| 2656 | 2656 | 1 | 1 |
| 2656 | 2656 | 1 | 2 |
| 2656 | 2656 | 1 | 3 |
| 2656 | 170166 | 2 | 1 |
| 2656 | 170166 | 2 | 2 |
| 2656 | 170167 | 3 | 1 |
| 2656 | 170167 | 3 | 2 |
| 2656 | 170168 | 4 | 1 |
| 2656 | 170168 | 4 | 2 |
内容的提问来源于stack exchange,提问作者user3333563
相关产品推荐
相关产品推荐

