1. 程式人生 > >sql使用聚合函式查詢多列問題

sql使用聚合函式查詢多列問題

常用的聚合函式

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;