SQL Server:按分组取列最大值更新符合条件NULL记录
SQL Server 分组匹配最大版本值更新空记录方案
适用场景
目标表包含4个字段:
Id:主键Version:整型版本号Item No.:整型分组字段Notes:VARCHAR类型备注字段
更新规则:
- 按
Item No.字段分组,定位每个分组内Version值最大的记录,提取其Notes内容 - 将提取到的备注值,写入同分组下
Version为NULL且Notes为空的记录 - 若
Version为NULL的记录本身已有Notes值,不执行覆盖更新
可直接执行的SQL代码
第一步:先预览待更新数据(避免误更新,必做)
执行以下查询确认待更新的行、更新后的值完全符合预期:
WITH GroupMaxVersionInfo AS ( SELECT [Item No.], -- 按分组取Version最大行对应的Notes FIRST_VALUE(Notes) OVER ( PARTITION BY [Item No.] ORDER BY Version DESC ) AS MaxVersionNotes FROM 你的表名 -- 替换成实际表名 WHERE Version IS NOT NULL -- 仅从有效版本行计算最大值 ) SELECT t.Id, t.[Item No.], t.Version, t.Notes AS 原始备注值, g.MaxVersionNotes AS 待写入备注值 FROM 你的表名 t INNER JOIN GroupMaxVersionInfo g ON t.[Item No.] = g.[Item No.] WHERE t.Version IS NULL -- 仅匹配Version为空的目标行 AND ISNULL(t.Notes, '') = '' -- 仅匹配备注为空(含NULL、空字符串)的行 AND g.MaxVersionNotes IS NOT NULL -- 排除分组无有效版本的场景 GROUP BY t.Id, t.[Item No.], t.Version, t.Notes, g.MaxVersionNotes
第二步:执行更新
确认预览结果无误后,执行更新语句:
WITH GroupMaxVersionInfo AS ( SELECT [Item No.], FIRST_VALUE(Notes) OVER ( PARTITION BY [Item No.] ORDER BY Version DESC ) AS MaxVersionNotes FROM 你的表名 WHERE Version IS NOT NULL ) UPDATE t SET t.Notes = g.MaxVersionNotes FROM 你的表名 t INNER JOIN GroupMaxVersionInfo g ON t.[Item No.] = g.[Item No.] WHERE t.Version IS NULL AND ISNULL(t.Notes, '') = '' AND g.MaxVersionNotes IS NOT NULL GROUP BY t.Id, t.Notes, g.MaxVersionNotes
规则匹配验证
执行更新后,对应场景会完全符合预期:
- Item No.为31的分组:最大Version值为2对应Notes值
kinda tasty,会成功写入同组Id=1的Version为NULL、Notes为空的记录 - Item No.为32的分组:最大Version值为3对应Notes值
fabulous,会成功写入同组Id=4的Version为NULL、Notes为空的记录 - Item No.为33的分组:Id=8的Version为NULL记录已有Notes值
ambivalent,不会被同组最大Version对应的puke覆盖
注意事项
- 字段名
Item No.包含空格和特殊符号,SQL Server中必须用方括号[]包裹,否则会触发语法错误 - 代码中
ISNULL(t.Notes, '') = ''会同时匹配Notes为NULL、Notes为空字符串两种"空值"场景,如果业务规则中仅将NULL视为空,可将该条件替换为t.Notes IS NULL - 建议更新前在事务中执行,确认结果无误后再提交,事务写法参考:
BEGIN TRANSACTION; -- 此处粘贴上面的更新语句 -- 执行后查询验证结果 -- SELECT * FROM 你的表名 ORDER BY [Item No.], Version -- 验证正确执行提交 -- COMMIT TRANSACTION; -- 验证错误执行回滚 -- ROLLBACK TRANSACTION;
内容的提问来源于stack exchange,提问作者InvalidBrainException
相关产品推荐
相关产品推荐

