摘要:在本教學中,您將學習如何使用 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
子句衍生的欄位。它們不能參考 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)
下圖顯示結果

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
子句是聚合 (aggregate) 的,而 PARTITION BY
子句是分析 (analytic) 的。
在本教學中,您學習了 SQL PARTITION BY
子句,它可以變更視窗函數的結果計算方式。
這個教學對您有幫助嗎?