HIVE場景題之窗口函數一

1.1hive窗口函數

1.1.1瞭解哪些窗口函數,都是什麼功能?找一個在某個業務中的應用?
sum(col) over() : 分組對col累計求和,over() 中的語法如下count(col) over() : 分組對col累計,over() 中的語法如下min(col) over() : 分組對col求最小
max(col) over() : 分組求col的最大值
avg(col) over() : 分組求col列的平均值first_value(col) over() : 某分區排序後的第一個col值last_value(col) over() : 某分區排序後的最後一個col值
lag(col,n,DEFAULT) : 統計往前n行的col值,n可選,默認爲1,DEFAULT當往上第n行爲NULL時候, 取默認值,如不指定,則爲NULL
lead(col,n,DEFAULT) : 統計往後n行的col值,n可選,默認爲1,DEFAULT當往下第n行爲NULL時候, 取默認值,如不指定,則爲NULL
ntile(n) : 用於將分組數據按照順序切分成n片,返回當前切片值。注意:n必須爲int類型。

排名函數:
row_number() over() : 排名函數,不會重複,適合於生成主鍵或者不併列排名rank() over() : 排名函數,有並列名次,名次不連續。如:1,1,3 dense_rank() over() : 排名函數,有並列名次,名次連續。如:1,1,2

over(分組 排序 窗口) 中的order by後的語法:
1、物理窗口(真實往上下移動多少行rows between):

CURRENT ROW | UNBOUNDED PRECEDING | [num] PRECEDING AND
UNBOUNDED FOLLOWING | [num] FOLLOWING| CURRENT ROW

如: over(partition by col order by rows between 1 preceding and 1 fllowing)
在這裏插入圖片描述
2、 邏輯窗口(滿足條件上下多少行):

range between [num] PRECEDING AND [num] FOLLOWING

如: over(partition by col order by range between 5 preceding and 5 fllowing)
在這裏插入圖片描述
注意:窗口函數一般不和group by搭配使用。

應用:
某天某產品的累計銷售額。

1.1.2編寫sql實現每個用戶截止到每月爲止的最大單月訪問次數和累計到該月的總訪問次數
數 據 : userid,month,visits A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,16
A,2015-03,22
B,2015-03,23
B,2015-03,10
B,2015-03,1

每個用戶截止到每月爲止的最大單月訪問次數和累計到該月的總訪問次數,結果數據格式如下:
在這裏插入圖片描述
create table visits( userid int,
month string, visits int
)
row format delimited fields terminated by ‘,’
;

load data local inpath ‘/hivedata/visits.txt’ overwrite into table visits;

select userid, month, visits,
max(visits) over(distribute by userid sort by month) maxvisit, sum(visits) over(distribute by userid sort by month) totalvisit from
(select userid, month,
sum(visits) visits from visits
group by userid,month) t1
;
1.1.3求出每個欄目的被觀看次數及累計觀看時長
數 據 : vedio表
Uid channl min 1 1 23
2 1 12
3 1 12
4 1 32
5 1 342
6 2 13
7 2 34
8 2 13
9 2 134
參考答案:
create table video( Uid int,
channel string, min int1
)
row format delimited fields terminated by ’ ’
;
load data local inpath ‘/hivedata/video.txt’ into table video;

select
channel, count(1) num, sum(min) total from video
group by channel
;
1.1.4編寫連續7天登錄的總人數
數據:
t1表
Uid dt login_status(1登錄成功,0異常)
1 2019-07-11 1
1 2019-07-12 1
1 2019-07-13 1
1 2019-07-14 1
1 2019-07-15 1
1 2019-07-16 1
1 2019-07-17 1
1 2019-07-18 1
2 2019-07-11 1
2 2019-07-12 1
2 2019-07-13 0
2 2019-07-14 1
2 2019-07-15 1
2 2019-07-16 0
2 2019-07-17 1
2 2019-07-18 0
3 2019-07-11 1
3 2019-07-12 1
3 2019-07-13 1
3 2019-07-14 1
3 2019-07-15 1
3 2019-07-16 1
3 2019-07-17 1
3 2019-07-18 1

create table login( Uid int,
dt string, login_status int
)
row format delimited fields terminated by ’ ’
;

load data local inpath ‘/hivedata/login.txt’ into table login;

select uid, dt
from
(select t1.uid uid,
date_sub(t1.dt,t1.rm) dt from
(select uid, dt,
row_number() over(distribute by uid sort by dt) rm from login
where
login_status=1) t1)t2 group by uid,dt having count(uid) >7
;
在login表中

group by 直返會一個結果 直接淘汰

先求出登錄的天數 並排名
select uid,dt,row_number() over(distribute by uid sort by dt) rm from login where
login_status=1

再解決不連續登錄的問題 日期減去排名 得出一樣的日期 就是連續的
select t1.uid uid,date_sub(t1.dt,t1.rm) dt from
(select uid,dt,row_number() over(distribute by uid sort by dt) rm from login where
login=1) t1

最後按照uid 和 dt 進行分組 統計相同的數據 就是連續登錄的天數
select uid,dt from
(select t1.uid uid,
date_sub(t1.dt,t1.rm) dt from
(select uid, dt,
row_number() over(distribute by uid sort by dt) rm from login
where login=1) t1)t2
group by uid,dt having count(uid) >7;

date_add(date,interval expr type) 加
date_sub(date,interval expr type) 減
adddate(date,interval expr type)
subdate(date,interval expr type)
對日期時間進行加減法運算
(adddate()和subdate()是date_add()和date_sub()的同義詞,也
可以用運算符+和-而不是函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章