一 mysql處理方式
有一個學生分數表student,數據結構是這樣的
id(當前表ID) student_id(學生ID) line(分數) subject_type(科目類型)
1 1 80 1
2 1 78 1
3 1 56 1
4 2 99 1
5 2 20 1
我想根據學生分組 ,得到每個分組中分數最高的那一條數據:
SELECT
m.*,
MAX( m.line ) line_max
FROM
( SELECT * FROM student order by line desc limit 10000) m
GROUP BY
student_id
在mysql5.7版本之後,必須再排序之後加上limit關鍵字,20萬所測試的數據是正確的,親測驗證
注意:
limit 是必須要加的,如果不加的話,數據不會先進行排序,通過 explain 查看執行計劃,可以看到沒有 limit 的時候,少了一個 DERIVED 操作。
二 oracle 處理方式
SELECT
*
FROM
( SELECT ROW_NUMBER () OVER ( PARTITION BY STUDENT_ID ORDER BY LINE DESC ) rn, a.* FROM STUDENT a )
WHERE
rn = 1
注意:
partition by是分區函數,partition by常同row_number() over一起使用。