如何根据属性值选择前3名?

时间:2019-04-17 15:15:50

标签: sql sql-server

有一个包含4列的表格:id,student_name,phone_num,score。 我想根据分数选择前三名的学生。

表:

id|student_name  |phone_num|score

1 | James        | 001350  | 89

2 | Roomi        | 123012  | 78

3 | Sibay        | 123012  | 65

4 | Ellae        | 123012  | 78

5 | Katee        | 123012  | 33

如表所示,有两个学生的分数相同。 因此他们处于同一等级。

我尝试使用“ LIMIT”,但它只能选择3行。

SELECT id,student_name,score
FROM table
GROUP BY id,student_name,score
ORDER BY score
LIMIT 3

预期结果:

id|student_name  |score

1 | James        | 89

2 | Roomi        | 78

4 | Ellae        | 78

3 | Sibay        | 65

谢谢!

2 个答案:

答案 0 :(得分:6)

您要在此处使用DENSE_RANK

WITH cte AS (
    SELECT id, student_name, score,
        DENSE_RANK() OVER (ORDER BY score DESC) dr
    FROM yourTable
)

SELECT id, student_name, score
FROM cte
WHERE dr <= 3
ORDER BY score DESC;

enter image description here

另一种方法,使用子查询查找前3个最高得分:

SELECT id, student_name, score
FROM yourTable
WHERE score IN (SELECT DISTINCT TOP 3 score FROM yourTable ORDER BY score DESC)
ORDER BY score DESC;

第二种方法与您尝试执行的操作类似。这是第二个查询的演示:

Demo

答案 1 :(得分:6)

您将要使用排名功能-我建议密集排名。

; with CTE as 
    (Select ID, Student_Name, Score, Dense_Rank() over (order by score desc) as DR
    From Table)

Select *
from CTE
where DR <= 3

展开此功能:

Dense_Rank将为绑定值分配相同的编号,然后将下一个最大值分配给下一个最高编号(与Rank相比,如果有平局将跳过排名)。例如:

Value  Rank  Dense_Rank
1      1     1
3      2     2
3      2     2
7      4     3
8      5     4