簡體   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