繁体   English   中英

查找前 3 个值,但也包括 SQL 中的重复项

[英]Find top 3 values but also include duplicates in SQL

如果我有一张桌子,

姓名 分数
利亚姆 50
55
约翰 55
佩恩 60
洛帕 20

我想找到前 3 个标记,但如果有平局,我想包括它们并且人数可以超过 3。所以这张表将变成,

姓名 分数
佩恩 60
55
约翰 55
利亚姆 50

任何建议如何照顾领带部分?

你可以做这样的事情。 让 'tblMarks' 成为您的表名。 用您想要的值替换@N,例如。 3

select * from tblMarks where 
Marks between
(SELECT Marks from tblMarks e1 where 
        @N-1 = (SELECT COUNT(DISTINCT Marks)from tblMarks e2 where e2.Marks > e1.Marks))
        
and
(SELECT Marks from tblMarks e1 where 
        1-1 = (SELECT COUNT(DISTINCT Marks)from tblMarks e2 where e2.Marks > e1.Marks))
        
order by Marks desc
;

解释:

SELECT * from tblMarks e1 where 
        @N-1 = (SELECT COUNT(DISTINCT Marks)from tblMarks e2 where e2.Marks > e1.Marks) ;

将@N 替换为 1 以获得第一个不同的最高值,将 @N 替换为 2 以获得第二个不同的最高值,依此类推。

现在只需使用带有 between 运算符的子查询

  1. 最高分和
  2. 你想要的分数

因此,如果您在第一个查询中给出 3,它将是这样的

select * from tblMarks where 
Marks between 50 and 60
order by Marks Desc

因为 60 是最高分,50 是第三高分。

如果您使用的是 MySQL 8 或更高版本,则可以在此处使用DENSE_RANK分析函数:

WITH cte AS (
    SELECT *, DENSE_RANK() OVER (ORDER BY Marks DESC) rnk
    FROM yourTable
)

SELECT Names, Marks
FROM cte
WHERE rnk <= 3;

演示

要在不使用 CTE 的情况下执行此操作,只需将其内联:

SELECT Names, Marks
FROM
(
    SELECT *, DENSE_RANK() OVER (ORDER BY Marks DESC) rnk
    FROM yourTable
) t
WHERE rnk <= 3;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM