開窗函數簡單介紹
與聚合函數一樣,開窗函數也是需要對行進行分組, 然后使用聚合算子. 可是它不像普通聚合函數那樣每組只返回一個值,而是每一行返回一個窗口的聚合結果.
舉例說明
數據如下
hive (default)> select * from over_test;
open_test.name open_test.orderdate open_test.cost
jack 2017-04-06 42
mart 2017-04-08 62
mart 2017-04-09 68
mart 2017-04-11 75
mart 2017-04-13 94
over()
表示: 窗口沒有分組, 所有行在同一個行組中, 該行組一共5行. 每行都有一個開窗聚合結果, 聚合結果是5.
hive (default)> select name, count(*) over() from over_test;
name count_window_0
jack 5
mart 5
mart 5
mart 5
mart 5
over(partition by name)
表示: 窗口中的行組是以name字段進行分組的. 每行通過name字段對應相應的行組, 並其每行獲得一個該行組的聚合后的返回值, 這里有5行每行都有一個返回值.
jack所在行對應窗口中行組的行數是1, mart所在行對應窗口中行組的行數是4.
hive (default)> select name, count(*) over(partition by name ) from over_test;
name count_window_0
jack 1
mart 4
mart 4
mart 4
mart 4
group by
結合 over()
group by
的優先級高於開窗, 先group by name
生成兩行, 然后對每一行進行開窗聚合.
over()
對所有行進行開窗聚合
hive (default)> select name, count() over() from over_test group by name; name count_window_0 jack 2 mart 2
over(partition by name)
根據字段name開窗聚合
hive (default)> select name, count() over(partition by name) from over_test group by name; name count_window_0 jack 1 mart 1
開窗聚合過程總結
有多少行就有多少個開窗聚合結果.
over(partion by field1, field2)
根據字段對所有行進行分組, 然后對每一行選擇一個行組進行聚合一個聚合結果```over()
, 將所有行分為一個行組, 對每一行選擇該行組進行聚合得到一個結果- 如果有
group by
則先進行group by
, 再對group by
后的所有行進行開窗分組后, 按行組聚合