如何在SQL Server中为同值列生成连续序号(No.列)
如何在SQL Server中生成符合预期的连续序号(No.列)
目标数据表格
| No. | ReferenceNumber | TransactionTime | Amount | Source |
|---|---|---|---|---|
| 1 | 3099 | N/A | -1125 | A |
| 2 | 3099 | N/A | -1125 | B |
| 3 | 3100 | N/A | -375 | B |
| 4 | 3101 | 05:00 | -375 | A |
| 5 | 3101 | 05:00 | 2000 | B |
| 6 | 3101 | 06:00 | 2000 | A |
| 7 | 3102 | 06:00 | 2500 | B |
尝试的T-SQL代码
SELECT ROW_NUMBER() OVER (ORDER BY ReferenceNumber asc) No., ReferenceNumber, TransactionTime, Amount, Source FROM aTable
执行后得到的不符合预期结果
| No. | ReferenceNumber | TransactionTime | Amount | Source |
|---|---|---|---|---|
| 1 | 3099 | N/A | -1125 | A |
| 2 | 3099 | N/A | -375 | B |
| 3 | 3100 | N/A | -1125 | B |
| 4 | 3101 | 05:00 | -375 | A |
| 5 | 3101 | 05:00 | 2000 | B |
| 6 | 3101 | 06:00 | 2500 | B |
| 7 | 3102 | 06:00 | 2000 | A |
解决方案
要生成和目标表格一致的连续序号,需调整ROW_NUMBER()的排序规则,加入多维度排序条件,确保行的顺序与目标数据完全匹配:
SELECT ROW_NUMBER() OVER ( ORDER BY ReferenceNumber ASC, TransactionTime ASC, Amount ASC, Source ASC ) AS [No.], ReferenceNumber, TransactionTime, Amount, Source FROM aTable
规则说明
- 优先按
ReferenceNumber升序,保证相同编号的行归为一组 - 其次按
TransactionTime升序,区分不同时间的行(如3101的05:00行排在06:00行之前) - 再按
Amount升序,区分同编号、同时间下的行(如3101 05:00的-375行排在2000行之前) - 最后按
Source升序,处理同编号、同时间、同金额的行顺序(如3099的A行排在B行之前)
通过多字段组合排序,ROW_NUMBER()即可生成与目标表格完全一致的连续序号。
内容的提问来源于stack exchange,提问作者hildamathilda2
相关产品推荐
相关产品推荐

