Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
GROUPClause BY
Note
Pour savoir quelles intégrations de sources de AWS données prennent en charge cette SQL commande, consultez OpenSearch SQLCommandes et fonctions prises en charge.
La GROUP BY
clause est utilisée pour regrouper les lignes en fonction d'un ensemble d'expressions de regroupement spécifiées et pour calculer des agrégations sur le groupe de lignes en fonction d'une ou de plusieurs fonctions d'agrégation spécifiées.
Le système effectue également plusieurs agrégations pour le même ensemble d'enregistrements d'entrée via des ROLLUP
clauses GROUPING SETS
CUBE
,. Les expressions de regroupement et les agrégations avancées peuvent être mélangées dans la GROUP BY
clause et imbriquées dans une GROUPING SETS
clause. Voir plus de détails dans la Mixed/Nested Grouping Analytics
section.
Lorsqu'une FILTER
clause est attachée à une fonction d'agrégation, seules les lignes correspondantes sont transmises à cette fonction.
Syntaxe
GROUP BY group_expression [ , group_expression [ , ... ] ] [ WITH { ROLLUP | CUBE } ] GROUP BY { group_expression | { ROLLUP | CUBE | GROUPING SETS } (grouping_set [ , ...]) } [ , ... ]
Alors que les fonctions d'agrégation sont définies comme suit :
aggregate_name ( [ DISTINCT ] expression [ , ... ] ) [ FILTER ( WHERE boolean_expression ) ]
Paramètres
-
expression_groupe
Spécifie les critères selon lesquels les lignes sont regroupées. Le regroupement des lignes est effectué en fonction des valeurs de résultat des expressions de regroupement.
Une expression de regroupement peut être un nom de colonne
GROUP BY a
, une position de colonne ou une expression similaireGROUP BY a + b
.GROUP BY 0
-
grouping_set
Un ensemble de regroupement est spécifié par zéro ou plusieurs expressions séparées par des virgules entre parenthèses. Lorsque l'ensemble de regroupement ne comporte qu'un seul élément, les parenthèses peuvent être omises.
Par exemple,
GROUPING SETS ((a), (b))
est identique àGROUPING SETS (a, b)
.Syntaxe :
{ ( [ expression [ , ... ] ] ) | expression }
-
GROUPING SETS
Regroupe les lignes pour chaque ensemble de regroupement spécifié par la suite
GROUPING SETS
.Par exemple,
GROUP BY GROUPING SETS ((warehouse), (product))
est sémantiquement équivalent à l'union des résultats deGROUP BY warehouse
et.GROUP BY product
Cette clause est un raccourci pour un dans UNION ALL lequel chaque étape de l'UNION ALL
opérateur effectue l'agrégation de chaque ensemble de groupements spécifié dans laGROUPING SETS
clause.De même,
GROUP BY GROUPING SETS ((warehouse, product), (product), ())
est sémantiquement équivalent à l'union des résultats d'GROUP BY warehouse, product, GROUP BY product
un agrégat global. -
ROLLUP
Spécifie plusieurs niveaux d'agrégation dans une seule instruction. Cette clause est utilisée pour calculer des agrégations basées sur plusieurs ensembles de regroupement.
ROLLUP
est un raccourci pour.GROUPING SETS
Par exemple,
GROUP BY warehouse, product WITH ROLLUP or GROUP BY ROLLUP(warehouse, product)
équivaut àGROUP BY GROUPING SETS((warehouse, product), (warehouse), ())
.GROUP BY ROLLUP(warehouse, product, (warehouse, location))
est équivalent àGROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse), ())
.Les N éléments d'une ROLLUP spécification donnent N+1 GROUPINGSETS.
-
CUBE
CUBELa clause est utilisée pour effectuer des agrégations basées sur la combinaison des colonnes de regroupement spécifiées dans la clause GROUP BY. CUBEest un raccourci pour. GROUPING SETS
Par exemple,
GROUP BY warehouse, product WITH CUBE or GROUP BY CUBE(warehouse, product)
équivaut àGROUP BY GROUPING SETS((warehouse, product), (warehouse), (product), ())
.GROUP BY CUBE(warehouse, product, (warehouse, location))
est équivalent àGROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse, location), (product, warehouse, location), (warehouse), (product), (warehouse, product), ())
. Les N éléments d'uneCUBE
spécification donnentGROUPING SETS
2^N. -
Analyse des groupes mixtes/imbriqués
Une
GROUP BY
clause peut inclure plusieurs group_expressions et plusieurs.CUBE|ROLLUP|GROUPING SETS
GROUPING SETS
peut également comporter desCUBE|ROLLUP|GROUPING SETS
clauses imbriquées, telles queGROUPING SETS(ROLLUP(warehouse, location)
,CUBE(warehouse, location))
,GROUPING SETS(warehouse, GROUPING SETS(location, GROUPING SETS(ROLLUP(warehouse, location),
CUBE(warehouse, location))))
.CUBE|ROLLUP
est juste un sucre de syntaxe pourGROUPING SETS
. Reportez-vous aux sections ci-dessus pour savoir comment traduireCUBE|ROLLUP
enGROUPING SETS
.group_expression
peut être traité comme un seul groupeGROUPING SETS
dans ce contexte.Pour un multiple
GROUPING SETS
dans laGROUP BY
clause, nous générons un seulGROUPING SETS
en faisant un produit croisé de l'originalGROUPING SETS
. Pour imbriquerGROUPING SETS
dans laGROUPING SETS
clause, il suffit de prendre ses ensembles de regroupement et de les supprimer.Par exemple,
GROUP BY warehouse, GROUPING SETS((product), ()), GROUPING SETS((location, size), (location), (size), ()) and GROUP BY warehouse, ROLLUP(product), CUBE(location, size)
équivaut àGROUP BY GROUPING SETS( (warehouse, product, location, size), (warehouse, product, location), (warehouse, product, size), (warehouse, product), (warehouse, location, size), (warehouse, location), (warehouse, size), (warehouse))
.GROUP BY GROUPING SETS(GROUPING SETS(warehouse), GROUPING SETS((warehouse, product)))
est équivalent àGROUP BY GROUPING SETS((warehouse), (warehouse, product))
. -
nom_agrégat
Spécifie le nom d'une fonction d'agrégation (
MIN
MAX
COUNT
SUM
,AVG
,,,, etc.). -
DISTINCT
Supprime les doublons dans les lignes d'entrée avant qu'ils ne soient transmis aux fonctions d'agrégation.
-
FILTER
Filtres : les lignes d'entrée pour lesquelles la
WHERE
clauseboolean_expression
in the est évaluée à true sont transmises à la fonction d'agrégation ; les autres lignes sont ignorées.
Exemples
CREATE TABLE dealer (id INT, city STRING, car_model STRING, quantity INT); INSERT INTO dealer VALUES (100, 'Fremont', 'Honda Civic', 10), (100, 'Fremont', 'Honda Accord', 15), (100, 'Fremont', 'Honda CRV', 7), (200, 'Dublin', 'Honda Civic', 20), (200, 'Dublin', 'Honda Accord', 10), (200, 'Dublin', 'Honda CRV', 3), (300, 'San Jose', 'Honda Civic', 5), (300, 'San Jose', 'Honda Accord', 8); -- Sum of quantity per dealership. Group by `id`. SELECT id, sum(quantity) FROM dealer GROUP BY id ORDER BY id; +---+-------------+ | id|sum(quantity)| +---+-------------+ |100| 32| |200| 33| |300| 13| +---+-------------+ -- Use column position in GROUP by clause. SELECT id, sum(quantity) FROM dealer GROUP BY 1 ORDER BY 1; +---+-------------+ | id|sum(quantity)| +---+-------------+ |100| 32| |200| 33| |300| 13| +---+-------------+ -- Multiple aggregations. -- 1. Sum of quantity per dealership. -- 2. Max quantity per dealership. SELECT id, sum(quantity) AS sum, max(quantity) AS max FROM dealer GROUP BY id ORDER BY id; +---+---+---+ | id|sum|max| +---+---+---+ |100| 32| 15| |200| 33| 20| |300| 13| 8| +---+---+---+ -- Count the number of distinct dealer cities per car_model. SELECT car_model, count(DISTINCT city) AS count FROM dealer GROUP BY car_model; +------------+-----+ | car_model|count| +------------+-----+ | Honda Civic| 3| | Honda CRV| 2| |Honda Accord| 3| +------------+-----+ -- Sum of only 'Honda Civic' and 'Honda CRV' quantities per dealership. SELECT id, sum(quantity) FILTER ( WHERE car_model IN ('Honda Civic', 'Honda CRV') ) AS `sum(quantity)` FROM dealer GROUP BY id ORDER BY id; +---+-------------+ | id|sum(quantity)| +---+-------------+ |100| 17| |200| 23| |300| 5| +---+-------------+ -- Aggregations using multiple sets of grouping columns in a single statement. -- Following performs aggregations based on four sets of grouping columns. -- 1. city, car_model -- 2. city -- 3. car_model -- 4. Empty grouping set. Returns quantities for all city and car models. SELECT city, car_model, sum(quantity) AS sum FROM dealer GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ()) ORDER BY city; +---------+------------+---+ | city| car_model|sum| +---------+------------+---+ | null| null| 78| | null| HondaAccord| 33| | null| HondaCRV| 10| | null| HondaCivic| 35| | Dublin| null| 33| | Dublin| HondaAccord| 10| | Dublin| HondaCRV| 3| | Dublin| HondaCivic| 20| | Fremont| null| 32| | Fremont| HondaAccord| 15| | Fremont| HondaCRV| 7| | Fremont| HondaCivic| 10| | San Jose| null| 13| | San Jose| HondaAccord| 8| | San Jose| HondaCivic| 5| +---------+------------+---+ -- Group by processing with `ROLLUP` clause. -- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), ()) SELECT city, car_model, sum(quantity) AS sum FROM dealer GROUP BY city, car_model WITH ROLLUP ORDER BY city, car_model; +---------+------------+---+ | city| car_model|sum| +---------+------------+---+ | null| null| 78| | Dublin| null| 33| | Dublin| HondaAccord| 10| | Dublin| HondaCRV| 3| | Dublin| HondaCivic| 20| | Fremont| null| 32| | Fremont| HondaAccord| 15| | Fremont| HondaCRV| 7| | Fremont| HondaCivic| 10| | San Jose| null| 13| | San Jose| HondaAccord| 8| | San Jose| HondaCivic| 5| +---------+------------+---+ -- Group by processing with `CUBE` clause. -- Equivalent GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ()) SELECT city, car_model, sum(quantity) AS sum FROM dealer GROUP BY city, car_model WITH CUBE ORDER BY city, car_model; +---------+------------+---+ | city| car_model|sum| +---------+------------+---+ | null| null| 78| | null| HondaAccord| 33| | null| HondaCRV| 10| | null| HondaCivic| 35| | Dublin| null| 33| | Dublin| HondaAccord| 10| | Dublin| HondaCRV| 3| | Dublin| HondaCivic| 20| | Fremont| null| 32| | Fremont| HondaAccord| 15| | Fremont| HondaCRV| 7| | Fremont| HondaCivic| 10| | San Jose| null| 13| | San Jose| HondaAccord| 8| | San Jose| HondaCivic| 5| +---------+------------+---+ --Prepare data for ignore nulls example CREATE TABLE person (id INT, name STRING, age INT); INSERT INTO person VALUES (100, 'Mary', NULL), (200, 'John', 30), (300, 'Mike', 80), (400, 'Dan', 50); --Select the first row in column age SELECT FIRST(age) FROM person; +--------------------+ | first(age, false) | +--------------------+ | NULL | +--------------------+ --Get the first row in column `age` ignore nulls,last row in column `id` and sum of column `id`. SELECT FIRST(age IGNORE NULLS), LAST(id), SUM(id) FROM person; +-------------------+------------------+----------+ | first(age, true) | last(id, false) | sum(id) | +-------------------+------------------+----------+ | 30 | 400 | 1000 | +-------------------+------------------+----------+