SQL Server 2012中更新bill_no使其序列连续且重复项一致
问题:SQL Server 2012中更新bill_no使其连续递增,相同datetime对应同一bill_no
原始数据
| bill_no | datetime |
|---|---|
| 3125 | 2022-12-26 14:17:21.000 |
| 3125 | 2022-12-26 14:17:21.000 |
| 3126 | 2022-12-26 14:31:48.000 |
| 3126 | 2022-12-26 14:31:48.000 |
| 3127 | 2022-12-26 14:39:31.000 |
| 3128 | 2022-12-26 14:44:06.000 |
| 3129 | 2022-12-26 14:46:02.000 |
| 3130 | 2022-12-26 14:53:35.000 |
| 3130 | 2022-12-26 14:53:35.000 |
| 3276 | 2022-12-26 15:19:22.000 |
| 3285 | 2022-12-26 16:52:09.000 |
| 3285 | 2022-12-26 16:52:09.000 |
| 3285 | 2022-12-26 16:52:09.000 |
| 3286 | 2022-12-26 17:33:28.000 |
| 3286 | 2022-12-26 17:33:28.000 |
| 3286 | 2022-12-26 17:33:28.000 |
| 3286 | 2022-12-26 17:33:28.000 |
| 3286 | 2022-12-26 17:33:28.000 |
| 3287 | 2022-12-26 17:39:06.000 |
| 3288 | 2022-12-26 17:41:46.000 |
| 3289 | 2022-12-26 17:55:42.000 |
| 3290 | 2022-12-26 18:11:45.000 |
| 3291 | 2022-12-26 18:21:27.000 |
期望结果
| bill_no | datetime |
|---|---|
| 3125 | 2022-12-26 14:17:21.000 |
| 3125 | 2022-12-26 14:17:21.000 |
| 3126 | 2022-12-26 14:31:48.000 |
| 3126 | 2022-12-26 14:31:48.000 |
| 3127 | 2022-12-26 14:39:31.000 |
| 3128 | 2022-12-26 14:44:06.000 |
| 3129 | 2022-12-26 14:46:02.000 |
| 3130 | 2022-12-26 14:53:35.000 |
| 3130 | 2022-12-26 14:53:35.000 |
| 3131 | 2022-12-26 15:19:22.000 |
| 3132 | 2022-12-26 16:52:09.000 |
| 3132 | 2022-12-26 16:52:09.000 |
| 3132 | 2022-12-26 16:52:09.000 |
| 3133 | 2022-12-26 17:33:28.000 |
| 3133 | 2022-12-26 17:33:28.000 |
| 3133 | 2022-12-26 17:33:28.000 |
| 3133 | 2022-12-26 17:33:28.000 |
| 3133 | 2022-12-26 17:33:28.000 |
| 3134 | 2022-12-26 17:39:06.000 |
解决方案
使用CTE结合DENSE_RANK()函数为每个唯一的datetime分配连续的bill_no,再更新原表:
WITH RankedDates AS ( SELECT datetime, -- 以原数据最小bill_no3125为起始,生成连续序号 3125 + DENSE_RANK() OVER (ORDER BY datetime) - 1 AS new_bill_no FROM your_table GROUP BY datetime ) UPDATE t SET t.bill_no = rd.new_bill_no FROM your_table t INNER JOIN RankedDates rd ON t.datetime = rd.datetime;
说明
DENSE_RANK()按datetime排序,为每个唯一时间分配连续排名,不会跳过序号- 通过
GROUP BY datetime避免重复计算同一时间的排名 - 最终通过JOIN将新生成的连续
bill_no更新回原表对应记录
验证更新结果可执行:
SELECT bill_no, datetime FROM your_table ORDER BY datetime, bill_no;
内容的提问来源于stack exchange,提问作者user 1997
相关产品推荐
相关产品推荐

