SQL 視窗函式

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

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)

下圖說明了一個視窗框架及其選項。

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()
© .