SQL Server 2014中ORDER BY后对指定列执行去重的技术问题
解决SQL Server 2014中排序后去重取TOP6的问题
嘿,我明白你的问题了——当前的查询因为关联了points表,同一个meid可能对应多条points记录,导致排序后取TOP6时会出现重复的meid值。要实现先按pPoint降序排序,再对meid去重,最后取前6个唯一的meid,可以用以下两种常用方法:
方法1:使用ROW_NUMBER()窗口函数
窗口函数是SQL Server中处理“分组排序去重”场景的利器,我们可以给每个meid的记录按pPoint降序编号,只保留每个meid的第一条记录(也就是对应最高pPoint的那条),再取前6个:
SELECT TOP(6) meid FROM ( SELECT MedicalExpertise.meid, -- 按meid分组,每组内按pPoint降序编号 ROW_NUMBER() OVER (PARTITION BY MedicalExpertise.meid ORDER BY points.pPoint DESC) AS row_num FROM physician INNER JOIN MedicalExpertise ON physician.meid = MedicalExpertise.meid INNER JOIN points ON physician.phId = points.phID ) AS ranked_meids -- 只保留每个meid的第一条记录(最高pPoint的那条) WHERE row_num = 1 -- 按每个meid对应的最高pPoint降序排序 ORDER BY (SELECT MAX(pPoint) FROM points WHERE phID = (SELECT phId FROM physician WHERE meid = ranked_meids.meid)) DESC
方法2:先聚合再排序
如果只需要每个meid对应的最高pPoint来排序,也可以先用GROUP BY聚合出每个meid的最大pPoint,再按这个值排序取前6:
SELECT TOP(6) meid FROM ( SELECT MedicalExpertise.meid, MAX(points.pPoint) AS highest_point FROM physician INNER JOIN MedicalExpertise ON physician.meid = MedicalExpertise.meid INNER JOIN points ON physician.phId = points.phID -- 按meid分组,计算每个meid的最高pPoint GROUP BY MedicalExpertise.meid ) AS meid_point_summary -- 按最高pPoint降序排序,取前6个唯一的meid ORDER BY highest_point DESC
为什么原查询会出现重复?
原查询直接对关联后的所有记录排序,同一个meid可能因为关联了多条高pPoint的points记录,多次出现在TOP6的结果里。上面两种方法都先确保了每个meid只被选中一次,再按其对应的最高pPoint排序,就能得到你想要的去重后的结果。
内容的提问来源于stack exchange,提问作者user6648166
相关产品推荐
相关产品推荐

