版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 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傳回的是視窗最後一行,即最新一天的浏覽次數。