窗口函数OVER()的用法
OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
OVER()的语法、用法
OVER ( [ PARTITION BY column ] [ ORDER BY column2 ] )
PARTITION BY 子句进行分组;ORDER BY 子句进行排序。
OVER开窗函数必须与聚合函数或排序函数一起使用,聚合函数一般指SUM(),MAX(),MIN(),COUNT(),AVG()等常见函数;排序函数一般指RANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()等。
OVER()的使用示例
SUM后的开窗函数
SELECT *,
SUM(Salary) OVER(PARTITION BY GroupName) 每个组的总工资,
SUM(Salary) OVER(PARTITION BY GroupName ORDER BY ID) 每个组的累计总工资,
SUM(Salary) OVER(ORDER BY ID) 累计工资,
SUM(Salary) OVER() 总工资
from Employee
结果如下图所示:下面我逐个解释下每个OVER的意思。
SUM(Salary) OVER (PARTITION BY GroupName)
只对PARTITION BY后面的列GroupName进行分组,分组后求解Salary的和。
SUM(Salary) OVER (PARTITION BY GroupName ORDER BY ID)
对PARTITION BY后面的列GroupName进行分组,然后按ORDER BY 后的ID进行排序,然后在组内对Salary进行累加处理。
SUM(Salary) OVER (ORDER BY ID)
只对ORDER BY 后的ID内容进行排序,对排完序后的Salary进行累加处理。
SUM(Salary) OVER ()
对Salary进行汇总处理
COUNT后的开窗函数
SELECT *,
COUNT(*) OVER(PARTITION BY GroupName ) 每个组的个数,
COUNT(*) OVER(PARTITION BY GroupName ORDER BY ID) 每个组的累积个数,
COUNT(*) OVER(ORDER BY ID) 累积个数 ,
COUNT(*) OVER() 总个数
from Employee
结果如下所示:和上面的SUM类似,只不过上面是求和,这里是计数,大家可以对照理解下
#,ID,Name,GroupName,Salary,每个组的个数,每个组的累积个数,累积个数,总个数
1,1,小明,开发部,8000,3,1,1,10
2,4,小张,开发部,7600,3,2,2,10
3,5,小白,开发部,7000,3,3,3,10
4,8,小王,财务部,5000,3,1,4,10
5,9,小齐,财务部,,3,2,5,10
6,15,小刘,财务部,6000,3,3,6,10
7,16,小高,行政部,4500,4,1,7,10
8,17,小王,行政部,4000,4,2,8,10
9,18,小李,行政部,4500,4,3,9,10
10,19,小吴,行政部,4700,4,4,10,10
COUNT(*) OVER (PARTITION BY GroupName)
只对PARTITION BY后面的列GroupName进行分组,求每个组的数量。
COUNT(*) OVER (PARTITION BY GroupName ORDER BY ID)
对PARTITION BY后面的列GroupName进行分组,然后按ORDER BY 后的ID进行排序,然后在组的个数进行累加处理。
COUNT(*) OVER (ORDER BY ID)
只对ORDER BY 后的ID内容进行排序,对排完序后的组的数量进行累加处理。
COUNT(*) OVER ()
计算所有的行的数量。
当然他还可以和其他的聚合函数一起使用,大家可以一起去探索。