SQL TOP3查询去重问题:需剔除重复分数引发的多余结果
问题解决:SQL严格取每组前3条数据(避免分数重复时多返回)
你的原查询问题出在用分数值匹配筛选:当第三、第四名分数相同时,IN (SELECT TOP 3 t1.Score...)会把所有等于第三名分数的行都选出来,导致返回超过3条数据。加DISTINCT在TOP 3前也没用,因为DISTINCT只是去重分数值,还是会匹配所有对应分数的行。
换用**窗口函数ROW_NUMBER()**可以解决这个问题,它会给每个分组内的行分配唯一序号,严格控制返回行数:
SELECT Stamboomnr, Score, Trail, Time, Place, Quali, Division, StockKlasID FROM ( SELECT t.Stamboomnr, t.Score, t.Trail, t.Time, t.Place, t.Quali, t.Division, t.StockKlasID, -- 按Stamboomnr分组,分数降序排序,生成唯一序号 ROW_NUMBER() OVER(PARTITION BY t.Stamboomnr ORDER BY t.Score DESC) AS rn FROM Tbl09_Stock AS t ) AS ranked -- 只取每组前3条 WHERE rn <= 3 ORDER BY Stamboomnr, Score DESC;
补充说明:
PARTITION BY t.Stamboomnr:按Stamboomnr字段分组,确保每个编号单独计算排名ROW_NUMBER():即使分数相同,也会给行分配唯一的序号(比如同分数的行序号为1、2、3、4...),这样筛选rn <=3就能严格返回每组前3条数据- 如果你需要保留所有并列第三名的行(比如分数相同的都算前3),可以把
ROW_NUMBER()换成RANK(),但根据你的需求,ROW_NUMBER()更符合"只需要前三条"的要求
内容的提问来源于stack exchange,提问作者Allard
相关产品推荐
相关产品推荐

