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)

window_function_name

受支持的窗口函数名称,例如 ROW_NUMBER()RANK()SUM()

expression

窗口函数进行操作的目标表达式或列。

OVER 子句

OVER 子句定义窗口分区来形成行组,并指定分区中的行顺序。OVER 子句由三个子句组成:分区、顺序和框架子句。

分区子句将行划分为应用窗口函数的分区。其语法如下

PARTITION BY expr1, expr2, ...
Code language: SQL (Structured Query Language) (sql)

如果未指定 PARTITION BY 子句,则整个结果集将被视为单个分区。

顺序子句指定窗口函数操作的分区中的行顺序

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