五月 31, 2024
摘要:在本教程中,您将学习如何使用 PostgreSQL PARTITION BY
子句,来更改窗口函数计算结果的方式。
目录
PostgreSQL PARTITION BY 子句概述
PARTITION BY
子句是OVER
子句中的子句。PARTITION BY
子句可将一个查询的结果集划分为多个分区。窗口函数分别在每个分区上操作,并为每个分区进行重新计算。
下面显示了PARTITION BY
子句的语法:
window_function ( expression ) OVER (
PARTITION BY expression1, expression2, ...
order_clause
frame_clause
)
可以指定一个或多个列或表达式,来对结果集进行分区。expression1
、expression1
等,只能引用由FROM
子句派生的列。它们不能引用 SELECT 列表中的表达式或别名。
PARTITION BY
子句的表达式可以是列表达式、标量子查询或标量函数。请注意,标量子查询和标量函数始终返回单个值。
如果省略PARTITION BY
子句,则整个结果集将被视为单个分区。
PARTITION BY 与 GROUP BY
GROUP BY
子句通常会与聚合函数(如SUM()
和AVG()
)结合使用。GROUP BY
子句会汇总和计算每组的总和或平均值,这样减少了返回的行数。
例如,以下语句返回按部门划分的员工平均工资:
SELECT
department_id,
ROUND(AVG(salary)) avg_department_salary
FROM
employees
GROUP BY
department_id
ORDER BY
department_id;
下图显示了结果:
PARTITION BY
子句将结果集划分为多个分区,并更改窗口函数的计算方式。PARTITION BY
子句不会减少返回的行数。
以下语句返回员工的工资,以及员工所在部门的平均工资:
SELECT
first_name,
last_name,
department_id,
ROUND(AVG(salary) OVER (
PARTITION BY department_id
)) avg_department_salary
FROM
employees;
以下是部分输出:
简而言之,GROUP BY
子句是聚合性的,而PARTITION BY
子句是分析型的。
总结
在本教程中,您已经了解了 PostgreSQL PARTITION BY
子句,它可以更改窗口函数的结果计算方式。