sql - 如何根据属性值选择前 3 个?

标签 sql sql-server

有一个表有 4 列:id、student_name、phone_num、score。
我想根据分数选择前3名的学生。

table :

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


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

我尝试使用“限制”,但它只能选择 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

谢谢!

最佳答案

你会想要使用排名功能 - 我推荐 Dense Rank。

; 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

关于sql - 如何根据属性值选择前 3 个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55730956/

相关文章:

php starup sqlsrv 无法初始化模块

sql-server - 使用 select into where notists 查询时出现 SQL 错误

mysql - 如何按质量得分和发布日期对文章进行排序?

.net - ADO .Net - 如何在具有多个 IP 地址的系统上的 SqlConnection 中指定源 IP 地址

sql - varchar2(n) 和 varchar2(n char) 之间的 Oracle SQL 区别

SQL datediff - 年龄大于

c# - 为什么 sysprocesses 在 SQL Server 上长时间处于打开状态?

c# - 实时显示数据的替代选项

php - 在给定的时间跨度内发生了多少天

sql - 复合外键