摘要:在本教程中,您將學習 SQL 視窗函式,它可以輕鬆解決複雜的查詢挑戰。
SQL 視窗函式簡介 #
聚合函式對多行進行計算並返回單個輸出行。
以下查詢使用 SUM() 聚合函式來計算公司所有員工的總薪水。
SELECT
SUM(salary) total_salary
FROM
employees;Code language: SQL (Structured Query Language) (sql)輸出
total_salary
--------------
322400.00Code language: plaintext (plaintext)輸出表明查詢將 employees 表中的行分組為單行。
與聚合函式一樣,視窗函式也作用於一組行。但是,視窗函式不會將行分組為單個行。
例如,以下查詢使用 SUM() 函式作為視窗函式。
SELECT
first_name,
last_name,
salary,
SUM(salary) OVER () total_salary
FROM
employees;Code language: SQL (Structured Query Language) (sql)它返回每個員工的薪水以及所有員工的總薪水。
first_name | last_name | salary | sum_salary
-------------+-------------+----------+------------
Steven | King | 24000.00 | 322400.00
Neena | Kochhar | 17000.00 | 322400.00
Lex | De Haan | 17000.00 | 322400.00
Alexander | Hunold | 9000.00 | 322400.00
Bruce | Ernst | 6000.00 | 322400.00
...在此示例中,OVER() 子句使 SUM() 函式成為一個視窗函式。
下圖說明了聚合函式和視窗函式之間的主要區別。

SQL 視窗函式語法 #
這是視窗函式的基本語法:
window_function_name ( expression ) OVER (
partition_clause
order_clause
frame_clause
)Code language: SQL (Structured Query Language) (sql)window_function_name
視窗函式的名稱,例如 ROW_NUMBER()、RANK() 和 SUM()。
expression
視窗函式作用於的表示式或列。
OVER 子句
OVER 子句定義一個視窗或分割槽。OVER 子句包含三個子句:
- Partition By 子句
- Order By 子句
- Frame 子句
PARTITION BY 子句將行劃分為視窗函式應用的分割槽。它具有以下語法:
PARTITION BY expr1, expr2, ...Code language: SQL (Structured Query Language) (sql)如果您不使用 PARTITION BY 子句,視窗函式會將整個結果集視為單個分割槽。
ORDER BY 指定每個分割槽中行的順序。
ORDER BY
sort_expression [ASC | DESC] [NULL {FIRST| LAST}]
,...
Code language: SQL (Structured Query Language) (sql)一個視窗框架(frame)是當前分割槽的一個子集。要定義框架,您可以使用以下語法之一:
{ 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 ROWCode language: SQL (Structured Query Language) (sql)並且 frame_end 是以下選項之一:
CURRENT ROW
UNBOUNDED FOLLOWING
N FOLLOWINGCode 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()