最近做數據統計碰到的一些問題。
需求:統計當年累計數量以及累計總和。
遇到這個問題我們可能會首先想到sum(),但是聚合函數是只返回一行的,而我們需要的結果是逐行累加,且需要多行,所以需要使用到開窗函數order by與分析函數partition by,開窗函數指定了分析函數工作的數據窗口大小,這個數據窗口大小可能會隨着行的變化而變化。
就拿我寫的sql為例:
當年累計:按照年份分組
sum(a.installNum) over (partition by to_char(a.inst_date, 'yyyy') order by a.inst_date) as 'year_num'
累計總和
sum(a.installNum) over (order by a.inst_date) as 'total_num'
下面列一下開窗函數與分析函數搭配使用的情況:
1.有partition by有order by : 在partition by分組下,按照不同的order by 字段 實現遞增匯總
2.有partition by無order by: 實現分組內所有數據的匯總
3.無partition by有order by : 直接按order by 字段實現遞增匯總
4.無partition by無order by: 所有數據相加
當然,除了使用sum() over(),還有
count() over(partition by ... order by ...):求分組后的總數。
max() over(partition by ... order by ...):求分組后的最大值。
min() over(partition by ... order by ...):求分組后的最小值。
avg() over(partition by ... order by ...):求分組后的平均值。
lag() over(partition by ... order by ...):取出前n行數據。
lead() over(partition by ... order by ...):取出后n行數據。
ratio_to_report() over(partition by ... order by ...):Ratio_to_report() 括號中就是分子,over() 括號中就是分母。percent_rank() over(partition by ... order by ...)