You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:04