簡體   English   中英

每個GROUP BY限制SQL查詢

[英]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 descorder 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM