MS SQL Server 2008按前3字段去重并保留指定行的查询方案咨询
MS SQL Server 2008 按指定规则去重解决方案
实现思路
使用窗口函数ROW_NUMBER()按前3个字段f1/f2/f3分组,同分组内优先将f4不为空的行排序在前,最终取每个分组的第一条数据即可,完全符合需求规则。
可行查询代码
SELECT aKey, f1, f2, f3, f4, f5, f6 FROM ( SELECT *, ROW_NUMBER() OVER( PARTITION BY f1, f2, f3 ORDER BY CASE WHEN f4 <> '' THEN 0 ELSE 1 END ASC ) AS row_rank FROM #tmp ) AS filtered_tmp WHERE row_rank = 1
原代码问题说明
你原有写法存在两个缺陷导致排除过多行:
INNER JOIN自关联后,只会保留存在重复分组的行,无重复的独立行直接被过滤WHERE t1.f4 <> ''条件会进一步过滤掉独立行中f4为空的记录
效果验证
执行上述代码后,会返回8条符合预期的结果:两个重复分组各保留1条符合要求的行,剩余6条无重复的行全部保留,与预期完全一致。
内容的提问来源于stack exchange,提问作者EllenEEE
相关产品推荐
相关产品推荐

