[英]LIMIT SQL query per GROUP BY
我有20個教室,每個教室有50個學生。
是否可以在一個查詢語句中找到每個教室中的10名最佳學生?
表“klas”:
int id
int cla_id
int stu_id
int final_score
在大多數數據庫中,您可以:
select k.*
from (select k.*,
row_number() over (partition by cla_id order by final_score desc) as seqnum
from klas
) k
where seqnum <= 10;
這將檢索每班10名學生,得分最高。 它在MySQL和MS Access等不支持ANSI標准窗口函數(如row_number()
數據庫中不起作用。
row_number()
函數將順序編號應用於行。 在您的情況下,每個cla_id
的編號都會重新開始 - 因為partition by
子句。 數字為“1”的行是final_score
最大的final_score
- 因為order by final_score desc
的order by final_score desc
。 這也可以應用於聚合函數,如min()
和sum()
。 在這種情況下,它提供聚合值,但是在原始數據集的每一行上(相當於進行聚合和連接,但通常更有效)。
如果第10名最好的學生得分與11或12相同,你不想只返回10號,而且還要11和12.所以在這種情況下最好使用RANK(),如下所示:
;WITH ranking
AS
(
SELECT *
,RANK() OVER (PARTITION BY cla_id
ORDER BY final_score DESC) AS rank
FROM klas
)
SELECT cla_id
,rank
,stu_id
FROM ranking
WHERE rank <= 10
ORDER BY cla_id
,rank
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.