GROUP BY 子句 - Amazon Redshift

Amazon Redshift 自 2025 年 11 月 1 日起不再支援建立新的 Python UDF。如果您想要使用 Python UDF,請在該日期之前建立 UDF。現有 Python UDF 將繼續正常運作。如需詳細資訊,請參閱部落格文章

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

如果您在 SELECT 清單中排除 (EXCLUDE) 某一欄,則 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、pricepaid、commission 和 saletime。如需 SALES 資料表的詳細資訊,請參閱 範本資料庫

下列查詢依據 salesidlistid 分組,因此不需要在 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 ...