mysql/oracle分組後獲取每個組排序後的第一條數據

一 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一起使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章