摘要:本教程介绍 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)
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)
下图说明了一个框架及其选项

UNBOUNDED PRECEDING
:框架从分区的首行开始。N PRECEDING
:框架从当前行前 N 行开始。CURRENT ROW
:表示正在计算的当前行。UNBOUNDED FOLLOWING
:框架以分区中的最后一行结束。N FOLLOWING
:框架以当前行后的第 N 行结束。
ROWS
或 RANGE
指定当前行与框架行之间的关系类型。
-
ROWS
:当前行和框架行的偏移是行号。 -
RANGE
:当前行和框架行的偏移是行值。
SQL 窗口函数类型
窗口函数分为三类:值窗口函数、聚合窗口函数和排名窗口函数
值窗口函数
排名窗口函数
聚合窗口函数
- AVG()
- COUNT()
- MAX()
- MIN()
- SUM()