基于ID列更新表及记录,请求SQL协助生成统一递增EID
解决分组分配递增ErrorID并更新表的问题
我来帮你搞定这个给重复分组分配唯一递增errorid,并且同步更新对应记录的需求。咱们分两步走:先给每个重复的(message, type)分组生成从1000开始的递增eid,再用这个映射关系更新原表的eid字段。
步骤1:生成分组与eid的映射关系
首先,我们用CTE(公共表表达式)给每个符合条件的分组(也就是出现次数>1的(message, type)组合)分配唯一的eid。这里用ROW_NUMBER()函数实现递增,起始值设为1000:
WITH GroupEIDs AS ( SELECT message, type, -- 从1000开始,按message和type排序生成递增eid,排序规则可按需调整 1000 + ROW_NUMBER() OVER (ORDER BY message, type) AS eid FROM testing GROUP BY message, type HAVING COUNT(1) > 1 )
步骤2:更新原表的eid字段
接下来,把上面生成的eid映射关联到原表,给同一分组下的所有记录设置相同的eid:
WITH GroupEIDs AS ( SELECT message, type, 1000 + ROW_NUMBER() OVER (ORDER BY message, type) AS eid FROM testing GROUP BY message, type HAVING COUNT(1) > 1 ) UPDATE t SET eid = ge.eid FROM testing t JOIN GroupEIDs ge ON t.message = ge.message AND t.type = ge.type;
可选:验证结果是否正确
如果你想确认每个分组的eid和对应的id列表是否匹配,可以把eid加到你原来的查询里:
WITH GroupEIDs AS ( SELECT message, type, 1000 + ROW_NUMBER() OVER (ORDER BY message, type) AS eid FROM testing GROUP BY message, type HAVING COUNT(1) > 1 ) SELECT ge.eid, t.message, t.type, COUNT(1) AS total, STUFF( (SELECT N',' + CONVERT(NVARCHAR(MAX), id) FROM dbo.testing t2 WHERE t2.message = t.message and t2.type = t.type FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS id_list FROM testing t JOIN GroupEIDs ge ON t.message = ge.message AND t.type = ge.type GROUP BY ge.eid, t.message, t.type HAVING COUNT(1) > 1;
注意事项
- 如果你的
testing表还没有eid字段,需要先执行这句创建字段:ALTER TABLE testing ADD eid INT; ROW_NUMBER()里的ORDER BY可以根据你的需求调整,比如想按重复次数从多到少分配eid,就改成ORDER BY COUNT(1) DESC, message, type。- 如果表中已有
eid值,且需要保留原有值只更新未分配的,可以在UPDATE语句里加WHERE t.eid IS NULL。
内容的提问来源于stack exchange,提问作者FSaiyya
相关产品推荐
相关产品推荐

