[英]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.