有一个包含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
谢谢!
答案 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;
另一种方法,使用子查询查找前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;
第二种方法与您尝试执行的操作类似。这是第二个查询的演示:
答案 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