PostgreSQL 教程: PARTITION BY 分区计算

五月 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
)

可以指定一个或多个列或表达式,来对结果集进行分区。expression1expression1等,只能引用由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;

下图显示了结果:

SQL Partition By - group by clause

PARTITION BY子句将结果集划分为多个分区,并更改窗口函数的计算方式。PARTITION BY子句不会减少返回的行数。

以下语句返回员工的工资,以及员工所在部门的平均工资:

SELECT 
    first_name,
    last_name,
    department_id, 
    ROUND(AVG(salary) OVER (
        PARTITION BY department_id
    )) avg_department_salary
FROM
    employees;

以下是部分输出:

sql partition by - window function AVG example

简而言之,GROUP BY子句是聚合性的,而PARTITION BY子句是分析型的。

总结

在本教程中,您已经了解了 PostgreSQL PARTITION BY子句,它可以更改窗口函数的结果计算方式。