摘要:在本教程中,您将学习如何使用 SQL PARTITION BY
子句来更改窗口函数计算结果的方式。
SQL PARTITION BY 子句概述
PARTITION BY
子句是 OVER
子句的一个子句。 PARTITION BY
子句将查询的结果集划分为分区。 窗口函数针对每个分区分别运行,并针对每个分区重新计算。
以下显示了 PARTITION BY
子句的语法
window_function ( expression ) OVER (
PARTITION BY expression1, expression2, ...
order_clause
frame_clause
)
Code language: SQL (Structured Query Language) (sql)
您可以指定一个或多个列或表达式来对结果集进行分区。 expression1
、expression1
等只可以引用 FROM
子句派生的列。它们不能引用选择列表中的表达式或 别名。
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;
Code language: SQL (Structured Query Language) (sql)
下图显示了结果

PARTITION BY
子句将结果集划分为分区,并更改窗口函数的计算方式。 PARTITION BY
子句不会减少返回的行数。
以下语句返回员工的工资以及员工部门的平均工资
SELECT
first_name,
last_name,
department_id,
ROUND(AVG(salary) OVER (
PARTITION BY department_id
)) avg_department_salary
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
以下是部分输出

简单来说,GROUP BY
子句是聚合的,而 PARTITION BY
子句是分析的。
在本教程中,您学习了 SQL PARTITION BY
子句,该子句更改窗口函数结果的计算方式。
本教程是否有帮助?