資料準備:
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
需求:
(1)查詢在 2017 年 4 月份購買過的顧客及總人數
(2)查詢顧客的購買明細及月購買總額
(3)上述的場景,要將 cost 按照日期進行累加
(4)查詢每個顧客上次的購買時間
(5)查詢前 20%時間的訂單資訊
建表並匯入資料:
create
table business(
name string,
orderdate string,
cost int
)row format delimited fields
terminated
by','
;load
data
local inpath "/opt/module/datas/business.txt"
into
table business
(1)查詢在 2017 年 4 月份購買過的顧客及總人數:
select name,
count(*
)over()
from business
where
month
(orderdate)
='04'
group
by name;
結果:
mart 2
jack 2
(2)查詢顧客的購買明細及月購買總額
select name,orderdate,cost,
sum(cost)
over
(partition
by name,
month
(orderdate)
)from business
group
by name,orderdate,cost;
結果:
jack 2017-01-05 46 111
jack 2017-01-08 55 111
jack 2017-01-01 10 111
jack 2017-02-03 23 23
jack 2017-04-06 42 42
mart 2017-04-09 68 299
mart 2017-04-13 94 299
mart 2017-04-11 75 299
mart 2017-04-08 62 299
neil 2017-05-10 12 12
neil 2017-06-12 80 80
tony 2017-01-02 15 94
tony 2017-01-04 29 94
tony 2017-01-07 50 94
(3)上述的場景,要將 cost 按照日期進行累加
select name,orderdate,cost,
sum(cost)
over
(distribute by name sort by cost)
from business;
結果:
jack 2017-01-05 46 111
jack 2017-01-08 55 111
jack 2017-01-01 10 111
jack 2017-02-03 23 23
jack 2017-04-06 42 42
mart 2017-04-09 68 299
mart 2017-04-13 94 299
mart 2017-04-11 75 299
mart 2017-04-08 62 299
neil 2017-05-10 12 12
neil 2017-06-12 80 80
tony 2017-01-02 15 94
tony 2017-01-04 29 94
tony 2017-01-07 50 94
(4)查詢每個顧客上次的購買時間
select name,orderdate,lag(orderdate,1,
'2000-01-01'
)over
(distribute by name sort by orderdate)
from business;
結果:
jack 2017-01-01 2000-01-01
jack 2017-01-05 2017-01-01
jack 2017-01-08 2017-01-05
jack 2017-02-03 2017-01-08
jack 2017-04-06 2017-02-03
mart 2017-04-08 2000-01-01
mart 2017-04-09 2017-04-08
mart 2017-04-11 2017-04-09
mart 2017-04-13 2017-04-11
neil 2017-05-10 2000-01-01
neil 2017-06-12 2017-05-10
tony 2017-01-02 2000-01-01
tony 2017-01-04 2017-01-02
tony 2017-01-07 2017-01-04
(5)查詢前 20%時間的訂單資訊
select
*from
(select name,orderdate,cost,ntile(5)
over
(order
by orderdate)
as t
from business) t1
where t=
1
結果:
jack 2017-01-01 10 1
tony 2017-01-02 15 1
tony 2017-01-04 29 1
Hive視窗函式
1 定義 視窗函式屬於sql中比較高階的函式 mysql從8.0版本才支援視窗函式,5.6,5.7都沒有視窗函式 oracle 裡面一直支援視窗函式 hive也支援視窗函式 以下函式才是視窗函式 視窗函式 13個 lead lead col,n,default val 往後第n行資料 col 列名 ...
hive 視窗函式
hive高階函式 row number rank dense rank 這三個視窗函式的使用場景非常多 例子 員工表中,求每個崗位薪水前兩名的員工資訊 name,入職日期,sal row number over partition by job order by sal desc 這個函式會返回組內...
hive視窗函式 Hive sql視窗函式原始碼分析
在了解了視窗函式實現原理 spark hive中視窗函式實現原理覆盤 和 sparksql比hivesql優化的點 視窗函式 之後,今天又擼了一遍hive sql 中視窗函式的原始碼實現,寫個筆記記錄一下。簡單來說,視窗查詢有兩個步驟 將記錄分割成多個分割槽 然後在各個分割槽上呼叫視窗函式。傳統的 ...