SQL PARTITION BY

摘要:在本教程中,您将学习如何使用 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)

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

下图显示了结果

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;
Code language: SQL (Structured Query Language) (sql)

以下是部分输出

sql partition by - window function AVG example

简单来说,GROUP BY 子句是聚合的,而 PARTITION BY 子句是分析的。

在本教程中,您学习了 SQL PARTITION BY 子句,该子句更改窗口函数结果的计算方式。

本教程是否有帮助?