SQL Server如何基于行内NULL值数量去重 保留NULL更少的行
解决方案
你原有语句的问题是ROW_NUMBER的排序规则未关联空值数量,同一Premise_ID下的排序是随机的,无法保证保留空值最少的行。按以下逻辑调整即可:
- 先统计每行的空值总数
- 同一
Premise_ID分组内按空值总数升序排序,空值最少的行标记为序号1 - 删除序号大于1的重复行
WITH CTE AS( SELECT *, -- 下方列名替换为你表中实际需要校验空值的字段名,有多少列就加多少个CASE WHEN NullCount = CASE WHEN 列1 IS NULL THEN 1 ELSE 0 END + CASE WHEN 列2 IS NULL THEN 1 ELSE 0 END + CASE WHEN 列3 IS NULL THEN 1 ELSE 0 END + CASE WHEN 其他需要校验的列 IS NULL THEN 1 ELSE 0 END, RN = ROW_NUMBER()OVER(PARTITION BY Premise_ID ORDER BY NullCount ASC) FROM sde.Premise_Test ) DELETE FROM CTE WHERE RN > 1
常见问题说明
你之前遇到的IS NULL高亮报错,是因为语法书写不规范导致,SQL Server中判断空值必须使用字段 IS NULL的格式,不能写字段 = NULL,也不要遗漏CASE WHEN的完整结构,即可避免报错。
如果同一Premise_ID下存在多行空值数量完全相同的情况,可以在ORDER BY NullCount ASC后追加额外排序规则(比如按主键ID升序),来明确最终保留的行,避免随机选择。
内容的提问来源于stack exchange,提问作者accedesoft
相关产品推荐
相关产品推荐

