group by 和聚合函數使用:每組返回一個統計值
partition by 和聚合函數使用:每組每行返回一個統計值,通常配合row_number排序函數使用
一、在group by后的結果集上使用聚合函數,會作用在分組下的所有記錄上。
group by 還有一個隱藏的功能:去重(求和時需要特別注意,因此窗口函數不要和group by 搭配使用,會存在計算漏掉的情況。)
eg:
select v_number,sum(v_number) over(order null) from temp315 group by temp315
1 33
1 33
2 33
30 33
select v_number,sum(v_number) over(order null) from temp315
1 34
1 34
2 34
30 34
二、而如果在partition結果上聚合,千萬注意聚合函數是逐條累計運行結果的!(如果想作用所有上求和,可以用(over order null));其中的逐條累計由over(order 字段)體現的。
select v_number,sum(v_number) over(order by v_number) from temp315
累加:相同的值一次全加上
1 2
1 2
2 4
30 34
不需要一次全加上,就用rowid唯一字段進行排序
select v_number,sum(v_number) over(order rowid) from temp315
1 1
1 2
2 4
30 34
總結:
窗口函數,逐條累計,若不需要逐條,可order by null;
窗口函數,相同值一次全加上,若不需要,可用order by rowid唯一限制;