SQL 視窗函數

摘要:在本教學中,您將學習 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)

這是部分輸出結果

sql window functions - SUM window function example

在此範例中,OVER() 子句表示 SUM() 函數用作視窗函數。

下圖說明了聚合函數和視窗函數之間的主要區別

sql window functions

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)

下圖說明了框架及其選項

SQL window function frame
  • UNBOUNDED PRECEDING:框架從分區的第一個資料列開始。
  • N PRECEDING:框架從目前資料列之前的第 N 個資料列開始。
  • CURRENT ROW:表示目前正在評估的資料列。
  • UNBOUNDED FOLLOWING:框架在分區的最後一個資料列結束。
  • N FOLLOWING:框架在目前資料列之後的第 N 個資料列結束。

ROWSRANGE 指定目前資料列和框架資料列之間的關係類型。

  •  ROWS:目前資料列和框架資料列的偏移量是資料列編號。
  •  RANGE:目前資料列和框架資料列的偏移量是資料列值。

SQL 視窗函數類型

視窗函數分為三種類型:值視窗函數、聚合視窗函數和排名視窗函數

值視窗函數

排名視窗函數

聚合視窗函數

  • AVG()
  • COUNT()
  • MAX()
  • MIN()
  • SUM()