Hive窗口分析函数(案例详细讲解)
Hive窗口分析函數(案例詳細講解)
- 一、語法結構
- 二、窗口函數
- 三、Over從句
- 四、分析函數
- 五、COUNT、SUM、MIN、MAX、AVG
- 1.數據準備
- 2.sql示例
- 六、RANK、DENSE_RANK、ROW_NUMBER、NTILE
- 1.RANK
- 2.ROW_NUMBER
- 3.DENSE_RANK
- 4.NTILE(n)
- 5.示例一:按照用戶的購買時間排序
- 6.示例二:按條件 求出用戶前1/3交易記錄
- 7.CUME_DIST
- 8.PERCENT_RANK
- 9.隨機抽取百分比的數據
- 七、LAG、LEAD、FIRST_VALUE、LAST_VALUE
- 1. LAG(col,n,DEFAULT)
- 2.LEAD(col,n,DEFAULT)
- 3.FIRST_VALUE
- 4.LAST_VALUE
- 八、GROUPING SETS、GROUPING__ID、CUBE、ROLLUP
- 九、參考資料
- 十、where to go
一、語法結構
- 語法結構:分析函數 over(partition by 列名 order by 列名 rows between 開始位置 and 結束位置)
- over()函數中包括三個函數:包括分區partition by 列名、排序order by 列名、指定窗口范圍rows between 開始位置 and 結束位置。
- 我們在使用over()窗口函數時,over()函數中的這三個函數可組合使用也可以不使用。
over()函數中如果不使用這三個函數,窗口大小是針對查詢產生的所有數據,如果指定了分區,窗口大小是針對每個分區的數據。
二、窗口函數
-
① LEAD(col,n,DEFAULT)
- 用于統計窗口內往下第n行值
- 第一個參數為列名,第二個參數為往下第n行(可選,默認為1),第三個參數為默認值(當往下第n行為NULL時候,取默認值,如不指定,則為NULL)。
-
② LAG(col,n,DEFAULT)
- 用于統計窗口內往上第n行值
- 第一個參數為列名,第二個參數為往上第n行(可選,默認為1),第三個參數為默認值(當往上第n行為NULL時候,取默認值,如不指定,則為NULL)
-
③ FIRST_VALUE
- 取分組內排序后,截止到當前行,第一個值
-
④ LAST_VALUE
- 取分組內排序后,截止到當前行,最后一個值
三、Over從句
-
1.使用標準的聚合函數COUNT、SUM、MIN、MAX、AVG
-
2.使用PARTITION BY語句,使用一個或者多個原始數據類型的列
-
3.使用PARTITION BY與ORDER BY語句,使用一個或者多個數據類型的分區或者排序列
-
4.使用窗口規范,窗口規范支持以下格式:
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) (ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) (ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING -
5.窗口范圍說明:
我們常使用的窗口范圍是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示從起點到當前行),常用該窗口來計算累加。
PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:當前行
UNBOUNDED:起點(一般結合PRECEDING,FOLLOWING使用)
UNBOUNDED PRECEDING表示該窗口最前面的行(起點)
UNBOUNDED FOLLOWING:表示該窗口最后面的行(終點)比如說:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示從起點到當前行)
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行)
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW(表示往前2行到當前行)
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示當前行到終點)當ORDER BY后面缺少窗口從句條件(即 分析函數 over(partition by 列名 order by 列名) ),窗口規范默認是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
當ORDER BY和窗口從句都缺失(即分析函數 over(partition by 列名)), 窗口規范默認是 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
注意:OVER從句支持以下函數, 但是并不支持和窗口一起使用它們:
Ranking函數: Rank, NTile, DenseRank, CumeDist, PercentRank.
Lead和 Lag函數(即 Ranking函數 不能和 Lead、Lag函數一起使用)
四、分析函數
-
①RANK:從1開始,按照順序按照值排序時產生一個自增編號,值相等時會重復,會產生空位(如:1、2、3、3、3、6)
-
②ROW_NUMBER:從1開始,按照順序,按照值排序時產生一個自增編號,不會重復(如:1、2、3、4、5、6)
-
③DENSE_RANK:從1開始,按照值排序時產生一個自增編號,值相等時會重復,不會產生空位(如:1、2、3、3、3、4)
-
④ CUME_DIST:小于等于當前值的行數/分組內總行數。比如,統計小于等于當前薪水的人數,所占總人數的比例
-
⑤PERCENT_RANK:分組內當前行的RANK值-1/分組內總行數-1
-
⑥ NTILE(n):用于將分組數據按照順序切分成n片,返回當前切片值,如果切片不均勻,默認增加第一個切片的分布。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
-
⑦Distinct: 去重。如COUNT(DISTINCT a) OVER (PARTITION BY c)
五、COUNT、SUM、MIN、MAX、AVG
本小節主要講解COUNT、SUM、MIN、MAX、AVG的用法。
1.數據準備
------------------------------------------------------------------------- //訂單表order : name, order_date, cost Jan,2020-01-01,87 Jan,2020-01-02,95 Jan,2020-03-03,68 Jan,2020-05-01,68 Ben,2020-04-01,94 Ben,2020-01-02,56 Ben,2020-04-03,84 Ben,2020-05-01,84 Dan,2020-02-01,64 Dan,2020-03-02,86 Dan,2020-04-03,84 Dan,2020-04-01,84 Tim,2020-03-01,65 Tim,2020-02-02,85 Tim,2020-01-03,78 Tim,2020-04-01,78 Bob,2020-02-01,67 Bob,2020-03-02,95 Bob,2020-04-03,70 Bob,2020-05-01,70 ------------------------------------------------------------------------ create table order_test(name string,order_date string, cost int) row format delimited fields terminated by ','; ------------------------------------------------------------------------- load data local inpath '/tmp/order.txt' into table order;2.sql示例
//COUNT、SUM、MIN、MAX、AVG //以 sum函數舉例 select name, order_date, cost,--① over():所有的數據求和。sum_01是一樣的。--求和范圍:order_test表的所有數據sum(cost) over() as sum_01,--② over(partition by) :按照name分組,對分組相加。組內的sum_02是一個值。--求和范圍:以name分組,每個組內求和sum(cost) over(partition by name) as sum_02,--③ over(parition by order by):按照name分組,對分組按照時間升序累加。組內sum_03是一個變化的累加值--求和范圍:默認為從起點到當前行。以name分組,每個組內按order_date累計求和。注意和②的區別sum(cost) over(partition by name order by order_date) as sum_03,--④ between unbounded preceding and current row : 同③,從起點到當前行。(order by 省略窗口范圍的默認范圍)sum(cost) over(partition by name order by order_date rows between unbounded preceding and current row) as sum_04,--⑤ rows between n preceding and current row: 以name分組,當前行和前面n行做聚合。聚合的行數為: n+1(當前行)。 示例為 n=1的情況sum(cost) over(partition by name order by order_date rows between 1 preceding and current row) as sum_05,--⑥ rows between n1 preceding and n2 following:以name分組,當前行 + 前n1行 +后n2行做聚合。聚合的行數為:n1+n2+1(當前行) 示例n1 n2 =1sum(cost) over(partition by name order by order_date rows between 1 preceding and 1 following) as sum_06,--⑦rows between current row and unbounded following:以name分組,當前行+后面的所有行sum(cost) over(partition by name order by order_date rows between current row and unbounded following) as sum_07from order_test;執行上面的sql:
select name, order_date, cost,sum(cost) over() as sum_01,sum(cost) over(partition by name) as sum_02,sum(cost) over(partition by name order by order_date) as sum_03,sum(cost) over(partition by name order by order_date rows between unbounded preceding and current row) as sum_04,sum(cost) over(partition by name order by order_date rows between 1 preceding and current row) as sum_05,sum(cost) over(partition by name order by order_date rows between 1 preceding and 1 following) as sum_06,sum(cost) over(partition by name order by order_date rows between current row and unbounded following) as sum_07from order_test;查詢結果如下:
name order_date cost sum_01 sum_02 sum_03 sum_04 sum_05 sum_06 sum_07Ben 2020-01-02 56 1562 318 56 56 56 150 318 Ben 2020-04-01 94 1562 318 150 150 150 234 262 Ben 2020-04-03 84 1562 318 234 234 178 262 168 Ben 2020-05-01 84 1562 318 318 318 168 168 84 Bob 2020-02-01 67 1562 302 67 67 67 162 302 Bob 2020-03-02 95 1562 302 162 162 162 232 235 Bob 2020-04-03 70 1562 302 232 232 165 235 140 Bob 2020-05-01 70 1562 302 302 302 140 140 70 Dan 2020-02-01 64 1562 318 64 64 64 150 318 Dan 2020-03-02 86 1562 318 150 150 150 234 254 Dan 2020-04-01 84 1562 318 234 234 170 254 168 Dan 2020-04-03 84 1562 318 318 318 168 168 84 Jan 2020-01-01 87 1562 318 87 87 87 182 318 Jan 2020-01-02 95 1562 318 182 182 182 250 231 Jan 2020-03-03 68 1562 318 250 250 163 231 136 Jan 2020-05-01 68 1562 318 318 318 136 136 68 Tim 2020-01-03 78 1562 306 78 78 78 163 306 Tim 2020-02-02 85 1562 306 163 163 163 228 228 Tim 2020-03-01 65 1562 306 228 228 150 228 143 Tim 2020-04-01 78 1562 306 306 306 143 143 78為了便于理解,我們以ben的四條數據,詳細說明sum_01 至 sum_07的計算結果
name order_date cost sum_01 sum_02 sum_03 sum_04 sum_05 sum_06 sum_07Ben 2020-01-02 56 1562 318 56 56 56 150 318 Ben 2020-04-01 94 1562 318 150 150 150 234 262 Ben 2020-04-03 84 1562 318 234 234 178 262 168 Ben 2020-05-01 84 1562 318 318 318 168 168 84-
①sum_01-——sum(cost) over() as sum_01
sum_01 = 1562是表總所有人的消費總額
-
②sum_02—— sum(cost) over(partition by name) as sum_02
sum_02 按name分組,是ben的消費總額 sum_02 =318 = 56+94+84+84
-
③sum_03——sum(cost) over(partition by name order by order_date) as sum_03
按照name分組,對分組按照時間升序累加。默認為從起點到當前行
sum_03 = 56 : 起點到當前行,兩行重合, 只有一條消費記錄:56 sum_03 = 150: 第一行加上第二行: 56+94 = 150 sum_03 = 234: 從第一行加到第三行 56+94+84 = 234 sum_03 = 318:同理累加 -
④sum_04——between unbounded preceding and current row
同③,從起點到當前行。(order by 省略窗口范圍的默認范圍)
-
⑤sum_05——rows between n preceding and current row:
以name分組,當前行和前面n行做聚合。聚合的行數為: n+1(當前行)。 示例為 n=1的情況。
sum_05 = 56:此時當前行是第1行,前面沒有行??偣簿鸵恍小?sum_05 = 150:此時當前行是第二行94,前面一行是56,相加 = 150 sum_05 = 178: 此時當前行是第三行84,前面一行是84,相加 = 178 sum_05 = 168:同理可得。 -
⑥ sum_06——rows between n1 preceding and n2 following:
以name分組,當前行 + 前n1行 +后n2行做聚合。聚合的行數為:n1+n2+1(當前行) 示例n1,n2 =1
sum_06 = 150:此時當前行是第一行56,沒有前一行,但是有后面(第二行 94):56+94 = 150 sum_06 = 234:此時當前行是第二行94,前面一行56,后面一行84, 94+56+84 = 234 sum_06 = 262:同理 sum_06 = 168:同理 -
⑦sum_07——rows between current row and unbounded following:
以name分組,當前行+后面的所有行
sum_07 = 318:當前行是第一行56,后面所有行:96,84,84。56+96+84+84 = 318 sum_07 = 262:當前行是第二行94,后面所有行:84,84。 94+84+84 = 262 sum_07 = 168:同理 sum_07 = 84: 同理。
用法小結:
- 本小節以sum為例,演示了聚合函數的用法,其他COUNT、AVG,MIN,MAX,和SUM用法一樣。
結果和ORDER BY相關,默認為升序
如果不指定ROWS BETWEEN,默認為從起點到當前行;
如果不指定ORDER BY,則將分組內所有值累加;
關鍵是理解ROWS BETWEEN含義,也叫做WINDOW子句:
PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:當前行
UNBOUNDED:無界限(起點或終點)
UNBOUNDED PRECEDING:表示從前面的起點
UNBOUNDED FOLLOWING:表示到后面的終點
六、RANK、DENSE_RANK、ROW_NUMBER、NTILE
1.RANK
- 從1開始,按照順序按照值排序時產生一個自增編號,值相等時會重復,會產生空位(如:1、2、3、3、3、6)
2.ROW_NUMBER
- 從1開始,按照順序,按照值排序時產生一個自增編號,不會重復(如:1、2、3、4、5、6)
3.DENSE_RANK
- 從1開始,按照值排序時產生一個自增編號,值相等時會重復,不會產生空位(如:1、2、3、3、3、4)
4.NTILE(n)
- 用于將分組數據按照順序切分成n片,返回當前切片值,如果切片不均勻,默認增加第一個切片的分布。
5.示例一:按照用戶的購買時間排序
select name,order_date,cost,- - row_number() 自然順序row_number() over(partition by name order by order_date) as rn,- -rank(): 相同重復,留下空位,排名總數不變rank() over(partition by name order by order_date) as rk,- - dens_rank():相同重復,不留空位,排名總數減少dense_rank() over(partition by name order by order_date) as den_rkfrom order_test ## 由于示例測試數據沒有用戶在同一天購買,所以測試效果不明顯。關鍵在于理解三個函數的不同點。6.示例二:按條件 求出用戶前1/3交易記錄
selectname,order_date,cost,- - 全局數據切片,切成3片ntile(3) over() as n1,- - 按照name 分組,然后組內數據切成3份ntile(3) over(partition by name) as n2,- - 全局按照cost(升序)排序,將數據切成3份ntile(3) over(order by cost) as n3,- -按照name分組,組內按照cost升序排列,將數據切成3份ntile(3) over(partition by name order by cost) as n4from order_test;查詢結果:
name order_date cost n1 n2 n3 n4Ben 2020-01-02 56 3 1 1 1 Ben 2020-05-01 84 2 3 2 1 Ben 2020-04-03 84 2 2 2 2 Ben 2020-04-01 94 3 1 3 3 Bob 2020-02-01 67 1 3 1 1 Bob 2020-04-03 70 1 1 1 1 Bob 2020-05-01 70 1 2 2 2 Bob 2020-03-02 95 1 1 3 3 Dan 2020-02-01 64 2 1 1 1 Dan 2020-04-01 84 2 3 2 1 Dan 2020-04-03 84 2 1 2 2 Dan 2020-03-02 86 2 2 3 3 Jan 2020-05-01 68 3 1 1 1 Jan 2020-03-03 68 3 1 1 1 Jan 2020-01-01 87 3 3 3 2 Jan 2020-01-02 95 3 2 3 3 Tim 2020-03-01 65 2 1 1 1 Tim 2020-04-01 78 1 3 2 1 Tim 2020-01-03 78 1 2 2 2 Tim 2020-02-02 85 1 1 3 37.CUME_DIST
-
小于等于當前值的行數/分組內總行數。比如,統計小于等于當前薪水的人數,所占總人數的比例
-
示例
todo
8.PERCENT_RANK
-
分組內當前行的RANK值-1/分組內總行數-1
-
示例
todo
9.隨機抽取百分比的數據
row_number() + rand()
① 先群求出表的總記錄數 with data_cnt ( select count(*) as cnt from t ) ② row_number() + rand() select * from (select *row_number() over(partition by t.date,order by rand()) rand_rkfrom t )t1 where t1.rand_rk / date_cnt.cnt < x% (目標百分比)七、LAG、LEAD、FIRST_VALUE、LAST_VALUE
1. LAG(col,n,DEFAULT)
-
用于統計窗口內往上(向后)第n行值,第一個參數為列名,第二個參數為往上第n行(可選,默認為1),第三個參數為默認值(當往上第n行為NULL時候,取默認值,如不指定,則為NULL)
-
示例:統計顧客上一次 和 上兩次購買的時間
selectname,order_date,cost,- - 計算每個顧客上一次購買的時間,如果沒有默認為1900-01-01lag(order_date,1,"1900-01-01") over(partition by name order by order_date) as last_time_01,- - 計算每個顧客上兩次購買的時間,如果沒有默認為nulllag(order_date,2) over(partition by name order by order_date) as last_time_02 from order_test;執行結果:
name order_date cost last_time_01 last_time_02Ben 2020-01-02 56 1900-01-01 NULL Ben 2020-04-01 94 2020-01-02 NULL Ben 2020-04-03 84 2020-04-01 2020-01-02 Ben 2020-05-01 84 2020-04-03 2020-04-01 Bob 2020-02-01 67 1900-01-01 NULL Bob 2020-03-02 95 2020-02-01 NULL Bob 2020-04-03 70 2020-03-02 2020-02-01 Bob 2020-05-01 70 2020-04-03 2020-03-02 Dan 2020-02-01 64 1900-01-01 NULL Dan 2020-03-02 86 2020-02-01 NULL Dan 2020-04-01 84 2020-03-02 2020-02-01 Dan 2020-04-03 84 2020-04-01 2020-03-02 Jan 2020-01-01 87 1900-01-01 NULL Jan 2020-01-02 95 2020-01-01 NULL Jan 2020-03-03 68 2020-01-02 2020-01-01 Jan 2020-05-01 68 2020-03-03 2020-01-02 Tim 2020-01-03 78 1900-01-01 NULL Tim 2020-02-02 85 2020-01-03 NULL Tim 2020-03-01 65 2020-02-02 2020-01-03 Tim 2020-04-01 78 2020-03-01 2020-02-02
2.LEAD(col,n,DEFAULT)
-
用于統計窗口內往下(向前)第n行值,第一個參數為列名,第二個參數為往下第n行(可選,默認為1),第三個參數為默認值(當往下第n行為NULL時候,取默認值,如不指定,則為NULL)。 記憶 lag(落后) ——> current(當前) ——>lead(領先)
-
示例:統計顧客下一次 和 下兩次購買的時間
selectname,order_date,cost,- - 計算每個顧客下一次購買的時間,如果沒有默認為1900-01-01lead(order_date,1,"1900-01-01") over(partition by name order by order_date) as next_time_01,- - 計算每個顧客下兩次購買的時間,如果沒有默認為nulllead(order_date,2) over(partition by name order by order_date) as next_time_02 from order_test;執行結果:
name order_date cost next_time_01 next_time_02Ben 2020-01-02 56 2020-04-01 2020-04-03 Ben 2020-04-01 94 2020-04-03 2020-05-01 Ben 2020-04-03 84 2020-05-01 NULL Ben 2020-05-01 84 1900-01-01 NULL Bob 2020-02-01 67 2020-03-02 2020-04-03 Bob 2020-03-02 95 2020-04-03 2020-05-01 Bob 2020-04-03 70 2020-05-01 NULL Bob 2020-05-01 70 1900-01-01 NULL Dan 2020-02-01 64 2020-03-02 2020-04-01 Dan 2020-03-02 86 2020-04-01 2020-04-03 Dan 2020-04-01 84 2020-04-03 NULL Dan 2020-04-03 84 1900-01-01 NULL Jan 2020-01-01 87 2020-01-02 2020-03-03 Jan 2020-01-02 95 2020-03-03 2020-05-01 Jan 2020-03-03 68 2020-05-01 NULL Jan 2020-05-01 68 1900-01-01 NULL Tim 2020-01-03 78 2020-02-02 2020-03-01 Tim 2020-02-02 85 2020-03-01 2020-04-01 Tim 2020-03-01 65 2020-04-01 NULL Tim 2020-04-01 78 1900-01-01 NULL
3.FIRST_VALUE
- 取分組內排序后,截止到當前行,第一個值
4.LAST_VALUE
-
取分組內排序后,截止到當前行,最后一個值
-
示例: 求每個用戶第一次 和最后一次購買的時間。
selectname,order_date,cost,- - ① 第一次購買時間first_value(order_date) over(partition by name order by order_date) as first_time_01,- - ② 最后一次購買時間last_value(order_date) over(partition by name order by order_date) as last_time_01,- - ③ 使用 last_value + order by desc 并不能取到最小值(第一次購買時間),- - 一定要注意范圍: 分組后,從起始行到當前行。 desc后 分組起始第一行都是最大時間,所以實際取得的是最后一次購買時間last_value(order_date) over(partition by name order by order_date desc) as fisrt_time_02,- - ④ 使用 first_value + order by desc 取到最大值(最后一次購買時間)- - 一定要注意范圍: 分組后,從起始行到當前行first_value(order_date) over(partition by name order by order_date desc) as last_time_02,- - ⑤ 使用 row_number() 取 rn = 1 可以獲得最小值,但是需要再嵌套一層row_number() over(partition by name order by order_date) as rn from order_test; -------------------------純sql------------------------------------- selectname,order_date,cost,first_value(order_date) over(partition by name order by order_date) as first_time_01,last_value(order_date) over(partition by name order by order_date) as last_time_01,last_value(order_date) over(partition by name order by order_date desc) as fisrt_time_02,first_value(order_date) over(partition by name order by order_date desc) as last_time_02,row_number() over(partition by name order by order_date) as rn from order_test;執行結果:
name order_date cost first_time_01 last_time_01 first_time_02 last_time_02 rnBen 2020-05-01 84 2020-01-02 2020-05-01 2020-05-01 2020-05-01 4 Ben 2020-04-03 84 2020-01-02 2020-04-03 2020-04-03 2020-05-01 3 Ben 2020-04-01 94 2020-01-02 2020-04-01 2020-04-01 2020-05-01 2 Ben 2020-01-02 56 2020-01-02 2020-01-02 2020-01-02 2020-05-01 1 Bob 2020-05-01 70 2020-02-01 2020-05-01 2020-05-01 2020-05-01 4 Bob 2020-04-03 70 2020-02-01 2020-04-03 2020-04-03 2020-05-01 3 Bob 2020-03-02 95 2020-02-01 2020-03-02 2020-03-02 2020-05-01 2 Bob 2020-02-01 67 2020-02-01 2020-02-01 2020-02-01 2020-05-01 1 Dan 2020-04-03 84 2020-02-01 2020-04-03 2020-04-03 2020-04-03 4 Dan 2020-04-01 84 2020-02-01 2020-04-01 2020-04-01 2020-04-03 3 Dan 2020-03-02 86 2020-02-01 2020-03-02 2020-03-02 2020-04-03 2 Dan 2020-02-01 64 2020-02-01 2020-02-01 2020-02-01 2020-04-03 1 Jan 2020-05-01 68 2020-01-01 2020-05-01 2020-05-01 2020-05-01 4 Jan 2020-03-03 68 2020-01-01 2020-03-03 2020-03-03 2020-05-01 3 Jan 2020-01-02 95 2020-01-01 2020-01-02 2020-01-02 2020-05-01 2 Jan 2020-01-01 87 2020-01-01 2020-01-01 2020-01-01 2020-05-01 1 Tim 2020-04-01 78 2020-01-03 2020-04-01 2020-04-01 2020-04-01 4 Tim 2020-03-01 65 2020-01-03 2020-03-01 2020-03-01 2020-04-01 3 Tim 2020-02-02 85 2020-01-03 2020-02-02 2020-02-02 2020-04-01 2 Tim 2020-01-03 78 2020-01-03 2020-01-03 2020-01-03 2020-04-01 1
特別注意:
- 一定要注意示例中 ③ 和 ④ 的情況,不能想當然(最好在紙上畫畫)。要明確窗口函數的范圍,指的是分組后的 起始位置到當前位置。再次明確下 起始位置指的是分組后的第一行(即窗口的第一行),
- 所以如果要求一個用戶的最后一次購買時間不能使用last_value函數(本質是取的當前行),可以使用first_value() + order by desc這樣永遠取的都是第一行,且desc倒序,第一行為最大值。
- 上述的 四個函數 都不能使用over條件子句(rows between ... and ...),即不能指定窗口的范圍。所以order by 后面不能指定范圍,那么對應的默認范圍就是 rows between unbounded preceding and current row,從起始位置到當前行。
- 以ben的四條數據 + last_value(order_date) over(partition by name order by order_date desc) as fisrt_time_02 為例
八、GROUPING SETS、GROUPING__ID、CUBE、ROLLUP
todo九、參考資料
-
hive wiki
-
https://blog.csdn.net/scgaliguodong123_/article/details/60135385
十、where to go
Hive面試/經典練習題
總結
以上是生活随笔為你收集整理的Hive窗口分析函数(案例详细讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pbrt3在windows10环境中的编
- 下一篇: R软件本地安装GitHub下载的R包