请求编写Transact-SQL脚本:按FK_ID重新生成SEQ连续序号
按FK_ID分组重新生成连续SEQ序号的Transact-SQL脚本
问题描述
现有数据表包含以下字段:
- PK_ID(数值型):值始终唯一
- FK_ID(数值型):单个FK_ID可对应多条PK_ID记录
- SEQ(数值型):表示PK_ID在对应FK_ID下的优先级序号,初始状态所有值均为1
需要编写Transact-SQL脚本,实现按FK_ID分组,将每组内的SEQ从1开始重新分配连续序号,直到该组最后一条记录。
当前数据示例
| PK_ID | FK_ID | SEQ |
|---|---|---|
| 121 | 18821 | 1 |
| 358 | 18821 | 1 |
| 611 | 18821 | 1 |
| 7251 | 23357 | 1 |
| 95 | 23357 | 1 |
| 922 | 15511 | 1 |
| 1 | 53810 | 1 |
| 777 | 53810 | 1 |
| 953 | 53810 | 1 |
| 120 | 53810 | 1 |
预期结果
| PK_ID | FK_ID | SEQ |
|---|---|---|
| 121 | 18821 | 1 |
| 358 | 18821 | 2 |
| 611 | 18821 | 3 |
| 7251 | 23357 | 1 |
| 95 | 23357 | 2 |
| 922 | 15511 | 1 |
| 1 | 53810 | 1 |
| 777 | 53810 | 2 |
| 953 | 53810 | 3 |
| 120 | 53810 | 4 |
解决方案
使用ROW_NUMBER()窗口函数结合CTE实现分组编号并更新:
WITH RankedData AS ( SELECT PK_ID, FK_ID, SEQ, ROW_NUMBER() OVER (PARTITION BY FK_ID ORDER BY PK_ID) AS New_SEQ FROM YourTableName -- 替换为实际数据表名称 ) UPDATE RankedData SET SEQ = New_SEQ;
说明
PARTITION BY FK_ID:按FK_ID对数据分组,每组单独生成序号ORDER BY PK_ID:指定每组内的排序规则(示例中按PK_ID升序,可根据需求修改排序字段)- CTE
RankedData生成包含新序号的临时数据集,通过UPDATE直接将新序号赋值给原表的SEQ字段
内容的提问来源于stack exchange,提问作者Bebra
相关产品推荐
相关产品推荐

