MySQL中的分組排名
假設有一個包含學生成績資料的表,其中包括學生ID、班級ID和成績,那麼在每個班級內對學生進行排名可以幫助深入了解他們的學習情況。這可以透過組合使用變數、子查詢和比較運算子來實現。
以下查詢使用變數 @student 和 @class:
<code class="language-sql">SELECT id_student, id_class, grade, @student:=CASE WHEN @class = id_class THEN @student + 1 ELSE 0 END AS rn, @class:=id_class AS clset FROM (SELECT @student:= -1) s, (SELECT @class:= -1) c, (SELECT * FROM mytable ORDER BY id_class, grade DESC, id_student ) t</code>
查詢流程:
資料排序: 最內層的子查詢 (SELECT * FROM mytable ORDER BY id_class, grade DESC, id_student)
先依班級ID排序,再依成績降序排序,最後依學生ID排序。這確保了同一班級內成績高的學生排名靠前。
變數初始化: 使用子查詢初始化變數 @student 和 @class 為 -1。
分配排名: SELECT
語句中的 CASE
語句檢查目前班級ID是否與前一個班級ID相同。如果相同,則 @student 加 1;否則,@student 重設為 0。這在每個班級內建立排名。
更新 @class: @class 變數被賦予目前班級ID。它在 CASE
語句中用於後續行,以確定學生是否屬於同一個班級。
透過使用變數和子查詢,此查詢有效地將學生分組到各自的班級中並相應地分配排名,從而提供了一種有意義的方式來解釋每個組內學生的學習情況。 請注意,此查詢按成績降序排列,成績高的學生排名靠前。如果需要按升序排列,請將 ORDER BY id_class, grade DESC, id_student
修改為 ORDER BY id_class, grade ASC, id_student
。
以上是如何在MySQL中將學生成績分組排名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!