天天看點

[Hive]視窗函數LEAD LAG FIRST_VALUE LAST_VALUE

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/SunnyYoona/article/details/56484919

視窗函數(window functions)對多行進行操作,并為查詢中的每一行傳回一個值。 OVER()子句能将視窗函數與其他分析函數(analytical functions)和報告函數(reporting functions)區分開來。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#1-%E5%B8%B8%E7%94%A8%E7%AA%97%E5%8F%A3%E5%87%BD%E6%95%B0 1. 常用視窗函數

下表列出了一些視窗函數以及描述資訊:

視窗函數 描述
LAG() LAG()視窗函數傳回分區中目前行之前行(可以指定第幾行)的值。 如果沒有行,則傳回null。
LEAD() LEAD()視窗函數傳回分區中目前行後面行(可以指定第幾行)的值。 如果沒有行,則傳回null。
FIRST_VALUE FIRST_VALUE視窗函數傳回相對于視窗中第一行的指定列的值。
LAST_VALUE LAST_VALUE視窗函數傳回相對于視窗中最後一行的指定列的值。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#2-%E8%AF%AD%E6%B3%95 2. 文法

LAG 和 LEAD 文法

LAG | LEAD
( <col>, <line_num>, <DEFAULT> )
OVER ( [ PARTITION BY ] [ ORDER BY ] )           

FIRST_VALUE | LAST_VALUE 文法

FIRST_VALUE | LAST_VALUE
( <col>,<ignore nulls as boolean> ) OVER
( [ PARTITION BY ] [ ORDER BY ][ window_clause ] )           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#3-example 3. Example

原資料:

hive> select * from tmp_pv;
OK
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-10	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-11	5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-12	7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-13	3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-14	2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-15	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-16	4
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-10	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-11	9
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-12	3
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-13	10
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-14	1
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-15	8
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-16	2
Time taken: 0.102 seconds, Fetched: 14 row(s)           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#31-lag 3.1 LAG()

LAG(col,n,DEFAULT)視窗函數傳回分區中目前行之前第n行對應列的值。 如果沒有相應的行,則傳回NULL。 第一個參數為列名,第二個參數為目前行之前第n行(可選,預設為1),第三個參數為缺失時預設值(目前行之前第n行為NULL沒有時,傳回該預設值,如不指定,則為NULL)。

為了比較每個使用者浏覽次數與前一天的浏覽次數進行比較,查詢傳回目前浏覽次數以及前一天的浏覽數量。由于在2017-02-10之前沒有浏覽行為,前一天的浏覽次數設定為0(不設定預設為NULL)。

hive> select gid, dt, pv, lag(pv, 1, 0) over (partition by gid order by dt) as pre_pv from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-10	1	0
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-11	5	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-12	7	5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-13	3	7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-14	2	3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-15	4	2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-16	4	4
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-10	2	0
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-11	9	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-12	3	9
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-13	10	3
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-14	1	10
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-15	8	1
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-16	2	8
Time taken: 11.783 seconds, Fetched: 14 row(s)           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#32-lead 3.2 LEAD()

LEAD(col,n,DEFAULT)視窗函數傳回分區中目前行後面第n行對應列的值。 如果沒有相應的行,則傳回NULL。 第一個參數為列名,第二個參數為目前行後面第n行(可選,預設為1),第三個參數為缺失時預設值(目前行後面第n行為沒有時,傳回該預設值,如不指定,則為NULL)。

為了比較每個使用者浏覽次數與後一天的浏覽次數進行比較,查詢傳回目前浏覽次數以及後一天的浏覽數量。由于在2017-02-16之後沒有浏覽行為,後一天的浏覽次數顯示為NULL(預設為NULL)

hive> select gid, dt, pv, lead(pv, 1) over (partition by gid order by dt) from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-10	1	5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-11	5	7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-12	7	3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-13	3	2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-14	2	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-15	4	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-16	4	NULL
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-10	2	9
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-11	9	3
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-12	3	10
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-13	10	1
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-14	1	8
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-15	8	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-16	2	NULL
Time taken: 9.509 seconds, Fetched: 14 row(s)           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#33-first_value 3.3 FIRST_VALUE()

為了比較每個使用者浏覽次數與第一天浏覽次數進行比較,查詢傳回目前浏覽次數以及第一天浏覽次數。第一個使用者第一天浏覽次數為1,第二個使用者第一天浏覽次數為2。

hive> select gid, dt, pv, first_value(pv) over (partition by gid order by dt) from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-10	1	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-11	5	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-12	7	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-13	3	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-14	2	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-15	4	1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-16	4	1
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-10	2	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-11	9	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-12	3	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-13	10	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-14	1	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-15	8	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-16	2	2
Time taken: 9.862 seconds, Fetched: 14 row(s)           

備注

上面例子視窗為第一行到目前行(缺失window子句有order by ,預設為rows between unbounded preceding and current row)。是以,first_value傳回視窗的第一行,即第一天浏覽次數。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBc7293ee662f2c29451b8c2e583af68c2%3Fmethod%3Ddownload%26read%3Dtrue#44-last_value 4.4 LAST_VALUE()

為了比較每個使用者浏覽次數與最新一天浏覽次數進行比較,查詢傳回目前浏覽次數以及最新一天浏覽次數。第一個使用者最新一天(2017-02-16)浏覽次數為4,第二個使用者最新一天(2017-02-16)浏覽次數為2。

hive> select gid, dt, pv, last_value(pv) over (partition by gid order by dt rows between current row and unbounded following) from tmp_pv;

0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-10	1	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-11	5	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-12	7	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-13	3	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-14	2	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-15	4	4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4	2017-02-16	4	4
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-10	2	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-11	9	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-12	3	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-13	10	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-14	1	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-15	8	2
993BD7AD-3B62-BA0C-15AE-A14B85921889	2017-02-16	2	2
Time taken: 9.335 seconds, Fetched: 14 row(s)           

上面例子的視窗為目前行到最後一行(rows between current row and unbounded following)。last_value傳回的是視窗最後一行,即最新一天的浏覽次數。