首頁 >資料庫 >mysql教程 >如何在 MySQL 中對組內資料進行排名?

如何在 MySQL 中對組內資料進行排名?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-17 19:51:10155瀏覽

How to Rank Data Within Groups in MySQL?

MySQL分組排名詳解

在某些場景下,需要根據分組對資料進行排名,而不僅依賴單一欄位。例如,假設有一個學生表,包含學生ID、班級ID和成績,如下所示:

ID_STUDENT ID_CLASS GRADE
1 1 90
1 2 80
2 1 99
3 1 80
4 1 70
5 2 78
6 2 90
6 3 50
7 3 90

為了根據成績對每個班級中的學生進行排名,可以使用以下MySQL查詢:

<code class="language-sql">SELECT id_student, id_class, grade,
   @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 1 END AS rn,
   @class:=id_class AS clset
FROM
  (SELECT @student:= 0) s,
  (SELECT @class:= 0) c,
  (SELECT *
   FROM mytable
   ORDER BY id_class, grade DESC, id_student
  ) t</code>

此查詢包含以下步驟:

  1. 變數初始化: 兩個使用者變數 @student@class 初始化為 0。

  2. 逐行處理: 外層查詢依 ORDER BY 子句指定的順序(id_classgrade DESCid_student)處理結果集的每一行。 注意這裡排序使用了 grade DESC,確保成績高的學生排名靠前。

  3. 組內排名: CASE 語句檢查目前 id_class 是否與前一個 id_class (@class) 相同。如果相同,則將 @student 加 1;否則,將 @student 重設為 1。這確保了 rn 值(排名)在每個組別(id_class)內是唯一的。

  4. 分組賦值: @class 賦值為目前 id_class,將在下一行進行比較。

此查詢的輸出將提供所需的學生分組排名:

ID_STUDENT ID_CLASS GRADE RANK
2 1 99 1
1 1 90 2
3 1 80 3
4 1 70 4
6 2 90 1
1 2 80 2
5 2 78 3
7 3 90 1
6 3 50 2

以上是如何在 MySQL 中對組內資料進行排名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn