Group-By
SQL:了解 GROUPING SET
據我了解, a 的目的
GROUPING SET
是將匯總行與原始數據行結合起來。這也可以通過將帶有GROUP BY
摘要的表格與UNION
子句組合來實現,但這種GROUPING SET
形式只是更有效,因為它一次完成工作。這樣理解合理
GROUPING SET
嗎?
據我所知,GROUPING SET 的目的是將匯總行與原始數據行結合起來。
是的,但是PostgreSQL 文件
GROUPING SETS
更清晰一些,使用分組集的概念可以實現比上述更複雜的分組操作。
FROM
andWHERE
子句選擇的數據按每個指定的分組集單獨分組,就像簡單的 GROUP BY 子句一樣為每個組計算聚合,然後返回結果。但這不僅更有效。將不同的聚合編組到單個結果集中要求它們都為其他正在聚合的列返回 NULL。這不容易維護,也不容易在大型查詢中創建。
例如,
CREATE TABLE foo(x,y) AS VALUES (1,1), (2,2), (1,2);
隨著查詢,
SELECT x, y, count(*) FROM foo GROUP BY GROUPING SETS ((x),(y),()) ORDER BY x,y; x | y | count ---+---+------- 1 | | 2 2 | | 1 | 1 | 1 | 2 | 2 | | 3 (5 rows)
可以改寫為
SELECT x, null AS y, count(*) -- GROUPING SET (x) FROM foo GROUP BY x UNION ALL SELECT null, y, count(*) -- GROUPING SET (y) FROM foo GROUP BY y UNION ALL SELECT null, null, count(*) -- NULL GROUPING SET FROM foo;
但是每個級別
UNION
都需要了解查詢其餘部分中編寫的聚合。用 PostgreSQL 測試的語法和範例