Group-By

SQL:了解 GROUPING SET

  • October 10, 2017

據我了解, a 的目的GROUPING SET是將匯總行與原始數據行結合起來。這也可以通過將帶有GROUP BY摘要的表格與UNION子句組合來實現,但這種GROUPING SET形式只是更有效,因為它一次完成工作。

這樣理解合理GROUPING SET嗎?

據我所知,GROUPING SET 的目的是將匯總行與原始數據行結合起來。

是的,但是PostgreSQL 文件GROUPING SETS更清晰一些,

使用分組集的概念可以實現比上述更複雜的分組操作。FROMandWHERE子句選擇的數據按每個指定的分組集單獨分組,就像簡單的 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 測試的語法和範例

引用自:https://dba.stackexchange.com/questions/188064