摘要:在本教學中,您將學習 SQL 視窗函數,這些函數能以簡單的方式解決複雜的查詢挑戰。
SQL 視窗函數簡介
聚合函數 對一組資料列執行計算,並傳回單一輸出資料列。
以下查詢使用 SUM()
聚合函數計算公司所有員工的總薪資
SELECT
SUM(salary) sum_salary
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
這是輸出結果

如輸出結果清楚所示,employees
資料表中的所有資料列都分組為單一資料列。
與聚合函數類似,視窗函數會對一組資料列進行計算。但是,視窗函數不會導致資料列分組為單一輸出資料列。
以下查詢使用 SUM()
作為視窗函數。它會傳回所有員工的總薪資以及每位個別員工的薪資
SELECT
first_name,
last_name,
salary,
SUM(salary) OVER() sum_salary
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
這是部分輸出結果

在此範例中,OVER()
子句表示 SUM()
函數用作視窗函數。
下圖說明了聚合函數和視窗函數之間的主要區別

SQL 視窗函數語法
視窗函數的語法如下:
window_function_name ( expression ) OVER (
partition_clause
order_clause
frame_clause
)
Code language: SQL (Structured Query Language) (sql)
視窗函數名稱
支援的視窗函數名稱,例如 ROW_NUMBER()
、RANK()
和 SUM()
。
運算式
視窗函數在其上運算的目標運算式或資料行。
OVER
子句
OVER
子句定義視窗分割,以形成資料列群組,並指定分割區中資料列的順序。OVER
子句由三個子句組成:partition、order 和 frame 子句。
partition 子句將資料列劃分為視窗函數應用於的分區。它具有以下語法
PARTITION BY expr1, expr2, ...
Code language: SQL (Structured Query Language) (sql)
如果未指定 PARTITION BY
子句,則將整個結果集視為單一分割區。
order 子句指定視窗函數在其上運算的分區中資料列的順序
ORDER BY
expression [ASC | DESC] [NULL {FIRST| LAST}]
,...
Code language: SQL (Structured Query Language) (sql)
框架是目前分區的子集。若要定義框架,請使用下列語法之一
{ RANGE | ROWS } frame_start
{ RANGE | ROWS } BETWEEN frame_start AND frame_end
Code language: SQL (Structured Query Language) (sql)
其中 frame_start
是下列選項之一
N PRECEDING
UNBOUNDED PRECEDING
CURRENT ROW
Code language: SQL (Structured Query Language) (sql)
而 frame_end
是下列選項之一
CURRENT ROW
UNBOUNDED FOLLOWING
N FOLLOWING
Code language: SQL (Structured Query Language) (sql)
下圖說明了框架及其選項

UNBOUNDED PRECEDING
:框架從分區的第一個資料列開始。N PRECEDING
:框架從目前資料列之前的第 N 個資料列開始。CURRENT ROW
:表示目前正在評估的資料列。UNBOUNDED FOLLOWING
:框架在分區的最後一個資料列結束。N FOLLOWING
:框架在目前資料列之後的第 N 個資料列結束。
ROWS
或 RANGE
指定目前資料列和框架資料列之間的關係類型。
-
ROWS
:目前資料列和框架資料列的偏移量是資料列編號。 -
RANGE
:目前資料列和框架資料列的偏移量是資料列值。
SQL 視窗函數類型
視窗函數分為三種類型:值視窗函數、聚合視窗函數和排名視窗函數
值視窗函數
排名視窗函數
聚合視窗函數
- AVG()
- COUNT()
- MAX()
- MIN()
- SUM()