窗口函數
更新時間 2025-07-07 18:26:20
最近更新時間: 2025-07-07 18:26:20
分享文章
本文介紹窗口函數的基本語法及示例。
普通的聚合函數只能用來計算一行內的結果或把所有行聚合成一行結果,而窗口函數支持為每一行或多行分區生成一個結果。
window_function?over?(
????[partition?by?partition_expr]
????[order?by?order_expr]
)
- 分區:由partition by子句定義。partition by子句用于劃分窗口分區,如果沒有指定partition by子句,則整個統計分析結果集作為一個窗口分區。
- 排序:由order by子句定義。order by子句用于對窗口分區內的行進行排序。
函數列表
| 函數名稱 | 語法 | 說明 |
|---|---|---|
| dense_rank | dense_rank() | 無間隙排序。 |
| ntile | ntile(n) | 將一個數據集分成n個分組,每個分組中包含盡可能相等數量的行。 |
| rank | rank() | 有間隙排序。 |
| row_number | row_number() | 為每條分組記錄返回一個數字。 |
| first_value | first_value(x) | 返回各個窗口分區內第一個值。 |
| last_value | last_value(x) | 返回各個窗口分區內最后一個值。 |
| nth_value | nth_value(x, offset) | 返回窗口分區中第x行開始的第一個非null值。 |
| lag | lag(x) | 返回窗口分區內位于當前行上方第x行的值。 |
| lead | lead(x) | 返回窗口分區內位于當前行下方第x行的值。 |
dense_rank函數
無間隙排名。相同值擁有相同的排名,排名是連續的。
語法
dense_rank()?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
無
返回值類型
integer類型
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
SELECT method, ua, req_cnt, dense_rank() OVER (PARTITION BY ua ORDER BY req_cnt desc) AS denseRank |
ntile函數
將一個數據集分成n個分組,每個分組中包含盡可能相等數量的行。
語法
ntile(n)?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|---|---|---|
| n | 分組個數 | integer類型 | 是 |
返回值類型
integer類型
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
level:error |
rank函數
有間隙排序。相同值擁有相同的排名,排名不一定是連續的。
語法
rank()?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
無
返回值類型
integer類型
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
SELECT method, ua, req_cnt, rank() OVER (PARTITION BY ua ORDER BY req_cnt desc) AS rank_num |
row_number函數
為每條分組記錄返回一個數字。
語法
row_number()?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|
返回值類型
integer類型
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
select level, time, caller, row_number() over (partition by caller) |
first_value函數
返回各個窗口分區內第一個值。
語法
first_value(x)?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|---|---|---|
| x | 列名 | 任意數據類型 | 是 |
返回值類型
與x數據類型一致
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
select level, time, caller, first_value(time) over (partition by caller) |
last_value函數
返回各個窗口分區內最后一個值。
語法
last_value(x)?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|---|---|---|
| x | 列名 | 任意數據類型 | 是 |
返回值類型
與x數據類型一致
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
select level, time, caller, last_value(time) over (partition by caller) |
nth_value函數
返回各個窗口分區內最后一個值。
語法
nth_value(x,?offset)?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|---|---|---|
| x | 列名 | 任意數據類型 | 是 |
| offset |
偏移量 | int類型 | 是 |
返回值類型
與x數據類型一致
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
select level, time, caller, nth_value(time, 100) over (partition by caller) |
lag函數
返回在有序幀內當前行之前的指定物理偏移行上的求值。
語法
lag(x,?offset)?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|---|---|---|
| x | 列名 | 任意數據類型 | 是 |
| offset | 偏移量 | int類型 | 是 |
返回值類型
與x數據類型一致
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
select level, time, caller, lag(time, 3) over (partition by caller) |
lead函數
返回在有序行中當前行之后偏移行上的求值。
語法
lead(x,?offset)?over?(?[partition?by?partition_expr]?[order?by?order_expr]?)
參數說明
| 參數名稱 | 說明 | 類型 | 是否必選 |
|---|---|---|---|
| x | 列名 | 任意數據類型 | 是 |
| offset | 偏移量 | int類型 | 是 |
返回值類型
與x數據類型一致
示例
| 類型 |
示例 |
|---|---|
| 統計分析語句 |
select level, time, caller, lead(time, 3) over (partition by caller) |