在Hive中支持窗口函數,Mysql在8.0版本後也支持使用,用好以後猶如開掛!sql
Window Function又稱爲窗口函數、分析函數。聚合函數能夠將多行數據按照規定聚合爲一行,通常來說彙集後的行數要少於彙集前的行數。可是有時咱們想要既顯示彙集前的數據,又要顯示彙集後的數據,這時便引入了窗口函數。函數
運行順序:窗口函數是在select時執行的,位於order by以前。spa
語法總結:排序
sum(A) over(partition by B order by C rows between D1 and D2)it
avg(A) over(partition by B order by C rows between D1 and D2)io
max(A) over(partition by B order by C rows between D1 and D2)select
min(A) over(partition by B order by C rows between D1 and D2)語法
count(A) over(partition by B order by C rows between D1 and D2)總結
partition by:至關於分組數據
order by:按照什麼順序進行累加等。默認升序asc, 降序爲desc。
A:須要被加工的字段名稱,對指定字段計算
B:分組的字段名稱
C:排序的字段名稱
D1,D2:計算的行數範圍
rows between:也叫window子句
unbounded:無界的
preceding:以前
following:以後
current row:當前行
unbounded preceding:前面的起點
unbounded following:後面的終點
rows between unbounded preceding and current row:以前全部行和本行,不寫rows between爲默認起點到當前行;
rows between 3 preceding and current row:前3行和本行(共4行);
rows between current row and unbounded following:本行和以後的全部行;
rows between current row and 3 following:本行和後面3行(共4行);
rows between 3 preceding and 1 following: 從前3行到下一行(共4行)。
1. row_number() over(partition by A order by B)
2. rank() over(partition by A order by B)
3. desc_rank() over(partition by A order by B)
返回相應規則的排序序號
1. 生成1 2 3 4 5 6 7 8 9 ... : row_number() 查詢出來的每一行生成一個序號,依次排序,且不重複
2 .生成1 1 1 4 5 6 7 7 9 ... : rank() 生成的序號相同時,下一個不一樣的會跳躍,跳躍排序
3. 生成1 1 1 2 3 3 4 5 6... :desc_rank()生成的序號相同時,下一個不一樣的不會跳躍,是連續排序
ntile(n) over(partition by A order by B)
n:切分的片數
A:分組的字段名稱
B:排序的字段名稱
ntile(n):用於將分組數據按照順序切分紅n片,返回切片值
不支持 rows between...
若是切片不均勻,默認從第一個開始均分,如 5 5 4 4
lag:向上偏移 ---好比向上偏移2行 實則新行數據由原來的行總體下移兩行,前兩行出現空值可由默認值填充
lead:向下偏移 --同理
A:字段名稱
offset:
defavl:
例如 : lag(A,1,A) over(partition by USER_NAME order by A)
lag(A) over(partition by USER_NAME order by A)
lag(A,2) over(partition by USER_NAME order by A)
注意:必定要習慣取別名
lag( ... ) over(...) as ...
lead( ... ) over(...) as ...