Hive-窗口函數

在Hive中支持窗口函數,Mysql在8.0版本後也支持使用,用好以後猶如開掛!sql

Window Function又稱爲窗口函數、分析函數。聚合函數能夠將多行數據按照規定聚合爲一行,通常來說彙集後的行數要少於彙集前的行數。可是有時咱們想要既顯示彙集前的數據,又要顯示彙集後的數據,這時便引入了窗口函數。函數

運行順序:窗口函數是在select時執行的,位於order by以前。spa

1. 累計計算窗口函數

語法總結:排序

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行)。

2. 分區排序窗口函數

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()生成的序號相同時,下一個不一樣的不會跳躍,是連續排序

3. 切片:分組排序窗口函數

ntile(n) over(partition by A order by B)

n:切分的片數

A:分組的字段名稱

B:排序的字段名稱

ntile(n):用於將分組數據按照順序切分紅n片,返回切片值

不支持 rows between...

若是切片不均勻,默認從第一個開始均分,如 5 5 4 4

4. 偏移分析窗口函數

lag:向上偏移  ---好比向上偏移2行 實則新行數據由原來的行總體下移兩行,前兩行出現空值可由默認值填充

lead:向下偏移 --同理

lag(A,offset,defval) over(partition by ... order by ...)

A:字段名稱

offset:

  • 偏移量,便是向上偏移一個或n個的值,假設當前行爲第5行,offset爲3,則表示要找的數據爲數據行的第2行(5-3=2)
  • 默認值爲1

defavl:

  • 指定默認值:當取得值超出表的範圍,則將defavl指定的值做爲默認值
  • 沒指定默認值則返回null

例如 : 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(A,offset,defval) over(partition by ... order by ...)

注意:必定要習慣取別名

lag( ... ) over(...) as ...

lead( ... ) over(...) as ...

相關文章
相關標籤/搜索