HIVE視窗函式
阿新 • • 發佈:2020-11-25
hive視窗函式
視窗函式是什麼?
視窗函式指定了函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變化而變化。
下面我們練習一些視窗函式。
準備資料:
name,orderdate,cost
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
OVER():
指定分析函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變而變化。
CURRENT ROW:當前行
n PRECEDING:往前n行資料
n FOLLOWING:往後n行資料
UNBOUNDED:起點,UNBOUNDED PRECEDING 表示從前面的起點, UNBOUNDED FOLLOWING表示到後面的終點
select *, sum(cost) over (), -- 所有的行相加 sum(cost) over(partition by name), -- 按name分組,組內資料相加 sum(cost) over (partition by name order by orderdate), -- 按name分組,按照日期組內資料累加 sum(cost) over (partition by name order by orderdate rows between unbounded preceding and current row ), -- 跟上一條一樣,由起點到當前行的聚合 sum(cost) over (partition by name order by orderdate rows between 1 preceding and current row ), -- 當前行和前面一行做聚合 sum(cost) over (partition by name order by orderdate rows between 1 preceding and 1 following), -- 當前行和前面一行及後面一行 sum(cost) over (partition by name order by orderdate rows between current row and unbounded following) -- 當前行及後面所有行 from business;
LAG(col,n,default_val):往前第n行資料
LEAD(col,n, default_val):往後第n行資料
NTILE(n):把有序視窗的行分發到指定資料的組中,各個組有編號,編號從1開始,對於每一行,NTILE返回此行所屬的組的編號。注意:n必須為int型別。
select *,
ntile(5) over(order by orderdate) sorted
from business
RANK()
RANK() 排序相同時會重複,總數不會變
DENSE_RANK() 排序相同時會重複,總數會減少
ROW_NUMBER() 會根據順序計算
資料準備
name | subject | score |
---|---|---|
孫悟空 | 語文 | 87 |
孫悟空 | 數學 | 95 |
孫悟空 | 英語 | 68 |
大海 | 語文 | 94 |
大海 | 數學 | 56 |
大海 | 英語 | 84 |
宋宋 | 語文 | 64 |
宋宋 | 數學 | 86 |
宋宋 | 英語 | 84 |
婷婷 | 語文 | 65 |
婷婷 | 數學 | 85 |
婷婷 | 英語 | 78 |
select *,
rank() over (partition by subject order by score desc),
dense_rank() over (partition by subject order by score desc ),
row_number() over (partition by subject order by score desc)
from score;