sql使用聚合函式查詢多列問題
阿新 • • 發佈:2019-02-09
常用的聚合函式
COUNT():統計指定列不為NULL的記錄行數;
MAX():計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;
MIN():計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;
SUM():計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;
AVG():計算指定列的平均值,如果指定列型別不是數值型別,那麼計算結果為0;
1、學生表
一個班級有N組,每個組有N個學生,每個學生對應一個成績
2、查詢單列(或者包含聚合列)
==需求:查詢每組的最高成績以及組號==
select GroupId,max(Score) as maxScore from student GROUP BY GroupId;
這段語句在 SQLSERVER 和 MYSQL 中都是沒有問題的
3、特殊需求
==需求:查詢每組的最高成績以及組號以及最好成績學生的學號。==
執行下面的sql語句
select StudentId,GroupId,max(Score) as maxScore from student GROUP BY GroupId;
- 1
在MYSQL中是沒有問題的,因為MYSQL要查詢的列不必包含在GROUP BY中。而在SQLSERVER中是有問題的,SQLSERVER中要查詢的列必須包含在GROUP BY中。
在SQLSERVER中如何解決這個問題呢?就需要用到OVER了。(在MYSQL中是沒有OVER的)
OVER是對指定欄位進行分割槽,可以配合ROW_NUMBER()函式使用,該函式是顯示該列的行號。
假設我們對每組進行分割槽,在每個分割槽中按成績排序,那我們就得到了每組按成績排好序的行號。
select StudentId,GroupId,Score,ROW_NUMBER() over(partition by GroupId order by Score desc) as rowIndex from student;
即如果倒序排序的話,最小值項的行號必定是1,所以我們只需要找到每個分割槽行號是1的列。
此處不能直接進行查詢,因為where語句中是不能直接使用別名的。
select * from(select StudentId,GroupId,Score,ROW_NUMBER() over(partition by GroupId order by Score desc) as rowIndex from student) as b where b.rowIndex = 1;