[英]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 运算符的子查询
因此,如果您在第一个查询中给出 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.