一、基礎知識
-
定義
窗口函數(Window Function)對查詢結果集的子集(“窗口”)進行計算,保留原始行而非聚合為單行,適合復雜分析(如排名、累積和)。
基本語法:函數名() OVER ([PARTITION BY 列] -- 按列分組,類似GROUP BY但保留所有行[ORDER BY 列] -- 定義窗口內排序[ROWS/RANGE 范圍] -- 指定計算范圍 )
-
核心組件
PARTITION BY
:分區列,窗口計算獨立于每個分區(如按部門分組)。ORDER BY
:分區內排序,影響排名、累積計算邏輯。- 窗口幀(Frame):
ROWS BETWEEN n PRECEDING AND m FOLLOWING
:指定當前行前后包含的行數。RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW
:按值范圍定義(如時間間隔)。
二、窗口函數類型
1. 排名函數
函數 | 描述 | 示例場景 |
---|---|---|
ROW_NUMBER() | 唯一連續序號(同值不同號) | 按入職日期排序員工 |
RANK() | 允許并列且后續排名跳躍(如1,1,3) | 銷售額排名(同額同排名,后續跳號) |
DENSE_RANK() | 并列排名連續(如1,1,2) | 工資排名(同薪不跳號) |
NTILE(n) | 數據均分n組并分配組號 | 按工資四分位分組 |
2. 分析函數
LAG(列, 偏移量)
/LEAD(列, 偏移量)
:
獲取當前行前/后指定偏移量的值(如對比上月銷售額):SELECT sale_date, amount, LAG(amount, 1) OVER (ORDER BY sale_date) AS prev_amount FROM sales; -- 獲取前一條記錄
FIRST_VALUE()
/LAST_VALUE()
:
返回窗口首行/末行的值(如部門最高工資)。
3. 聚合函數(窗口化)
- 累積計算:
SUM(sales) OVER (PARTITION BY product_id ORDER BY date) -- 按產品累計銷售額
- 移動平均:
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) -- 近3天移動平均
三、性能優化
- 索引策略:
- 為
PARTITION BY
和ORDER BY
涉及的列創建索引。
- 為