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 子句衍生的欄位。它們不能參考 select 列表中的表達式或別名

PARTITION BY 子句的表達式可以是欄位表達式、純量 子查詢 或純量函數。請注意,純量子查詢和純量函數總是回傳單一值。

如果省略 PARTITION BY 子句,則整個結果集將被視為單一分區。

PARTITION BY vs. 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 子句是聚合 (aggregate) 的,而 PARTITION BY 子句是分析 (analytic) 的。

在本教學中,您學習了 SQL PARTITION BY 子句,它可以變更視窗函數的結果計算方式。

這個教學對您有幫助嗎?