窗口函數(window functions)對多行進行操作,並為查詢中的每一行返回一個值。 OVER()子句能將窗口函數與其他分析函數(analytical functions)和報告函數(reporting functions)區分開來。
1. 常用窗口函數
下表列出了一些窗口函數以及描述信息:
窗口函數 描述
LAG() LAG()窗口函數返回分區中當前行之前行(可以指定第幾行)的值。 如果沒有行,則返回null。
LEAD() LEAD()窗口函數返回分區中當前行后面行(可以指定第幾行)的值。 如果沒有行,則返回null。
FIRST_VALUE FIRST_VALUE窗口函數返回相對於窗口中第一行的指定列的值。
LAST_VALUE LAST_VALUE窗口函數返回相對於窗口中最后一行的指定列的值。
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 ] )
3.demo
原數據:
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)
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)
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)
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返回窗口的第一行,即第一天瀏覽次數。
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返回的是窗口最后一行,即最新一天的瀏覽次數。