GROUP BY 子句 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

GROUP BY 子句

GROUP BY 子句會識別查詢的分組資料欄。它用於將資料表中所有列出的資料欄中具有相同值的資料列分組。列出資料欄的順序並不重要。結果是將具有共同值的每個資料列組合成代表群組中所有資料列的群組資料列。使用 GROUP BY 來消除輸出中的備援,並計算套用至群組的彙總。分組資料欄必須在查詢使用標準函數運算彙整時宣告,像是 SUM、AVG 和 COUNT。如需詳細資訊,請參閱彙總函數

語法

[ GROUP BY expression [, ...] | ALL | aggregation_extension ]

其中 aggregation_extension 為下列其中一項:

GROUPING SETS ( () | aggregation_extension [, ...] ) | ROLLUP ( expr [, ...] ) | CUBE ( expr [, ...] )

參數

運算式

在查詢的選取清單中,資料欄或表達式的清單必須符合非彙整表達式的清單。例如,請考量以下簡單查詢。

select listid, eventid, sum(pricepaid) as revenue, count(qtysold) as numtix from sales group by listid, eventid order by 3, 4, 2, 1 limit 5; listid | eventid | revenue | numtix -------+---------+---------+-------- 89397 | 47 | 20.00 | 1 106590 | 76 | 20.00 | 1 124683 | 393 | 20.00 | 1 103037 | 403 | 20.00 | 1 147685 | 429 | 20.00 | 1 (5 rows)

在此查詢中,選取清單是由兩個彙整表達式所構成。第一個使用 SUM 函數,第二個使用 COUNT 函數。其餘兩個資料欄 LISTID 和 EVENTID 必須宣告為分組資料欄。

GROUP BY 子句中的表達式也可以使用序數來參考選取清單。例如,前一個範例可縮減如下。

select listid, eventid, sum(pricepaid) as revenue, count(qtysold) as numtix from sales group by 1,2 order by 3, 4, 2, 1 limit 5; listid | eventid | revenue | numtix -------+---------+---------+-------- 89397 | 47 | 20.00 | 1 106590 | 76 | 20.00 | 1 124683 | 393 | 20.00 | 1 103037 | 403 | 20.00 | 1 147685 | 429 | 20.00 | 1 (5 rows)
ALL

ALL 表示依 SELECT 清單中指定的所有資料欄分組,彙總的資料欄除外。例如,請考慮以下查詢,依col1col2不需要在 GROUP BY 子句中個別指定哪些群組。資料欄col3SUM函數的引數,因此未分組。

SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL

如果您 EXCLUDE SELECT 清單中的資料欄,GROUP BY ALL 子句不會根據該特定資料欄將結果分組。

SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
aggregation_extension

您可以使用彙總延伸項目 GROUPING SETS、ROLLUP 和 CUBE,在單一陳述式中執行多個 GROUP BY 操作的工作。如需彙總延伸項目及相關函數的相關資訊,請參閱 彙總延伸項目

範例

下列範例使用包含資料欄的 SALES 資料表:salesid、listid、 sellerid、 buyerid、 eventid、dateid、qtysold、 價格已付、佣金和銷售時間。如需 SALES 資料表的詳細資訊,請參閱 範本資料庫

下列查詢群組範例依 salesid 和 分組,listid而不必在 GROUP BY 子句中個別指定。資料欄qtysoldSUM函數的引數,因此未分組。

SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL; salesid | listid | sum --------+---------+------ 33095 | 36572 | 2 88268 | 100813 | 4 110917 | 127048 | 1 ...

下列範例查詢會排除 SELECT 清單中的數個資料欄,因此 GROUP BY ALL 只會將 salesid 和 listid 分組。

SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime FROM sales GROUP BY ALL; salesid | listid --------+--------- 33095 | 36572 88268 | 100813 110917 | 127048 ...