SQL 中的窗口函数允许您对与当前行相关的表行集合执行计算,而不会像传统的聚合函数那样将结果折叠为单个输出行。 它们在由 OVER()
子句定义的数据“窗口”内运行,该子句指定如何对行进行分区、排序和构建框架以进行计算。 与常规聚合函数(例如,SUM()
或 AVG()
)不同,窗口函数保留单个行,同时添加计算值,这使得它们对于排名、运行总计或比较组内行等任务非常有用。
窗口函数有三个关键组成部分:分区、排序和框架。PARTITION BY
子句将行划分为组(类似于 GROUP BY
但没有聚合),并且计算在每个分区内执行。 例如,ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC)
根据薪资为每个部门内的员工分配唯一的排名。ORDER BY
子句定义分区内行的顺序,这对于 RANK()
或累积总和等函数至关重要。 帧子句(例如,ROWS BETWEEN 3 PRECEDING AND CURRENT ROW
)进一步缩小了计算中使用的行子集,从而实现了滑动窗口操作(如移动平均值)。
常见的用例包括使用 SUM(sales) OVER (ORDER BY date ROWS UNBOUNDED PRECEDING)
计算运行总计,使用 LAG()
或 LEAD()
将行与其同级行进行比较,或使用 NTILE()
分配百分位数。 例如,要分析月度销售趋势,您可以按月进行分区并计算每个分区内的累计总和。 窗口函数非常高效,因为它们避免了自连接或子查询,但它们需要仔细注意框架和排序才能获得准确的结果。 开发人员应注意,并非所有数据库都支持高级框架选项,因此语法在 PostgreSQL、MySQL 或 SQL Server 等系统之间可能会略有不同。