窗口函数
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 官方文档(英文)。