1. 程式人生 > 實用技巧 >HIVE視窗函式

HIVE視窗函式

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;