學習 Hive(十):視窗函式
視窗函式語法:
Function() OVER ([PARTITION BY <...>] [ORDER BY <...>] [Window Specification])
PARTITION BY
定義視窗分割槽,控制哪些資料行和當前資料行在同一個分割槽。
ORDER BY
定義視窗排序,控制分割槽內的排序方式,決定了當前行在分內的位置。
Window Specification 定義視窗幀,根據當前行的位置宣告哪些行將包含在幀中。 ofollow,noindex" target="_blank">更多
表、資料集、分割槽、幀和行的關係如下圖所示:
視窗函式可以分為三類:
- 聚合函式,通常的聚合函式,如
SUM
和MAX
等。 - 排序函式,排序資料函式,如
RANK
和ROW_NUMBER
等。 - 分析函式,統計和對比函式,如
LEAD
、LAG
和FIRST_VALUE
等。
樣例資料:
name | department | salary |
---|---|---|
Tom | A | 5500 |
Jerry | A | 5000 |
Lily | B | 7000 |
Lucy | A | 8000 |
Tony | B | 3800 |
Micheal | B | 4000 |
聚合函式
需求:計算每個僱員所在部門的總工資額。
查詢 SQL:
SELECT name, department, salary, SUM(salary) OVER (PARTITION BY department) AS sum FROM employee
查詢結果:
name | department | salary | sum |
---|---|---|---|
Tom | A | 5500 | 18500 |
Jerry | A | 5000 | 18500 |
Lily | B | 7000 | 14800 |
Lucy | A | 8000 | 18500 |
Tony | B | 3800 | 14800 |
Micheal | B | 4000 | 14800 |
排序函式
需求:計算每個僱員所在部門的工資排名。
查詢 SQL:
SELECT name, department, salary, RANK() OVER (PARTITION BY department SORT BY salary DESC) AS rank FROM employee
查詢結果:
name | department | salary | rank |
---|---|---|---|
Tom | A | 5500 | 2 |
Jerry | A | 5000 | 3 |
Lily | B | 7000 | 1 |
Lucy | A | 8000 | 1 |
Tony | B | 3800 | 3 |
Micheal | B | 4000 | 2 |
分析函式
需求:計算每個僱員所在部門的最高工資。
查詢 SQL:
SELECT name, department, salary, FIRST_VALUE(salary) OVER (PARTITION BY department SORT BY salary DESC) AS first FROM employee
查詢結果:
name | department | salary | rank |
---|---|---|---|
Tom | A | 5500 | 8000 |
Jerry | A | 5000 | 8000 |
Lily | B | 7000 | 7000 |
Lucy | A | 8000 | 8000 |
Tony | B | 3800 | 7000 |
Micheal | B | 4000 | 7000 |
參考
- Structured Query Language/Window functions
- Hive/LanguageManual+WindowingAndAnalytics" rel="nofollow,noindex" target="_blank">LanguageManual WindowingAndAnalytics
- Introducing Window Functions in Spark+SQL/">Spark SQL
- Hive分析視窗函式(一) SUM,AVG,MIN,MAX
- Hive分析視窗函式(二) NTILE,ROW NUMBER,RANK,DENSE RANK
- Hive分析視窗函式(三) CUME DIST,PERCENT RANK
- Hive分析視窗函式(四) LAG,LEAD,FIRST VALUE,LAST VALUE
- Hive分析視窗函式(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP