全部术语

窗口函数

PostgreSQL 中的窗口函数是什么?

窗口函数在一组相关的行上计算值,例如排名或累计总和,而不会像 GROUP BY 那样把这些行合并为一行。

窗口函数在与当前行相关的一组行上执行计算,这组行由 OVER 子句定义。与配合 GROUP BY 使用的聚合函数不同,每个输入行都会保留在输出中,并得到各自的结果。

PARTITION BY 将行划分为若干组,ORDER BY 设置每组内部的顺序。内置窗口函数包括 row_number、rank、dense_rank、lag、lead 和 first_value,任何普通聚合函数(例如 sum 或 avg)也都可以配合 OVER 使用。窗口函数只允许出现在查询的 SELECT 列表和 ORDER BY 子句中。

示例

该示例对每个队伍内的球员进行排名,并在每一行旁边显示该队伍的总得分。

CREATE TABLE scores (player text, team text, points int);
INSERT INTO scores VALUES
  ('ana', 'red', 30), ('ben', 'red', 25), ('cy', 'blue', 40), ('dee', 'blue', 35);

SELECT player, team, points,
       rank() OVER (PARTITION BY team ORDER BY points DESC) AS team_rank,
       sum(points) OVER (PARTITION BY team) AS team_total
FROM scores
ORDER BY team, team_rank;

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语