clausola GROUP BY
Si applica a: Databricks SQL Databricks Runtime
La clausola GROUP BY
viene usata per raggruppare le righe in base a un set di espressioni di raggruppamento e per calcolare aggregazioni sul gruppo di righe in base a una o più funzioni di aggregazione specificate.
Databricks SQL supporta anche aggregazioni avanzate per eseguire più aggregazioni per lo stesso record di input set tramite GROUPING SETS
, CUBE
, ROLLUP
clausole.
Le espressioni di raggruppamento e le aggregazioni avanzate possono essere miste nella GROUP BY
clausola e annidate in una GROUPING SETS
clausola .
Per altri dettagli, vedere la sezione Analisi raggruppamenti misti/annidati.
Quando una FILTER
clausola è associata a una funzione di aggregazione, solo le righe corrispondenti vengono passate a tale funzione.
Sintassi
GROUP BY ALL
GROUP BY group_expression [, ...] [ WITH ROLLUP | WITH CUBE ]
GROUP BY { group_expression | { ROLLUP | CUBE | GROUPING SETS } ( grouping_set [, ...] ) } [, ...]
grouping_set
{ expression |
( [ expression [, ...] ] ) }
Mentre le funzioni di aggregazione sono definite come
aggregate_name ( [ DISTINCT ] expression [, ...] ) [ FILTER ( WHERE boolean_expression ) ]
Parameters
ALL
Si applica a: Databricks SQL Databricks Runtime 12.2 LTS e versioni successive
Notazione abbreviata per aggiungere tutte le
SELECT
:list espressioni che non contengono funzioni di aggregazione comegroup_expression
s. Se non esisteGROUP BY ALL
alcuna espressione di questo tipo equivale a omettere laGROUP BY
clausola che genera un'aggregazione globale.GROUP BY ALL
non è garantito produrre un set di espressioni di gruppo che possano essere risolte. Azure Databricks genera UNRESOLVED_ALL_IN_GROUP_BY o MISSING_AGGREGATION se la clausola prodotta non è ben formata.group_expression
Specifica i criteri per raggruppare le righe. Il raggruppamento delle righe viene eseguito in base al risultato values delle espressioni di raggruppamento. Un'espressione di raggruppamento può essere un nome column come
GROUP BY a
, una posizione column comeGROUP BY 0
o un'espressione comeGROUP BY a + b
. Segroup_expression
contiene una funzione di aggregazione Azure Databricks genera un errore di GROUP_BY_AGGREGATE .grouping_set
Un raggruppamento set viene specificato da zero o più espressioni separate da virgole tra parentesi. Quando il raggruppamento set ha un solo elemento, è possibile omettere le parentesi. Ad esempio,
GROUPING SETS ((a), (b))
è identico aGROUPING SETS (a, b)
.SET DI RAGGRUPPAMENTO
Raggruppa le righe per ogni raggruppamento di set specificato dopo
GROUPING SETS
. Ad esempio:GROUP BY GROUPING SETS ((warehouse), (product))
è semanticamente equivalente a un'unione di risultati diGROUP BY warehouse
eGROUP BY product
.Questa clausola è una sintassi abbreviata per un
UNION ALL
where ogni segmento dell'operatoreUNION ALL
esegue l'aggregazione di ogni set di raggruppamento specificato nella clausolaGROUPING SETS
.Analogamente,
GROUP BY GROUPING SETS ((warehouse, product), (product), ())
è semanticamente equivalente all'unione dei risultati diGROUP BY warehouse, product
GROUP BY product
e a un'aggregazione globale.
Nota
Per la compatibilità di Hive, Databricks SQL consente GROUP BY ... GROUPING SETS (...)
.
Le GROUP BY
espressioni vengono in genere ignorate, ma se contengono espressioni aggiuntive oltre alle GROUPING SETS
espressioni, le espressioni aggiuntive verranno incluse nelle espressioni di raggruppamento e il valore è sempre Null.
Ad esempio, in SELECT a, b, c FROM ... GROUP BY a, b, c GROUPING SETS (a, b)
, l'output di column c è sempre null.
ROLLUP
Specifica più livelli di aggregazioni in una singola istruzione. Questa clausola viene usata per calcolare le aggregazioni in base a più set di raggruppamento.
ROLLUP
è una sintassi abbreviata perGROUPING SETS
. Ad esempio:GROUP BY warehouse, product WITH ROLLUP
o
GROUP BY ROLLUP(warehouse, product)
equivale a
GROUP BY GROUPING SETS((warehouse, product), (warehouse), ())
Mentre
GROUP BY ROLLUP(warehouse, product, (warehouse, location))
equivale a
GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse), ())
Gli N elementi di una
ROLLUP
specifica generano N+1GROUPING SETS
.CUBO
La clausola
CUBE
viene usata per eseguire aggregazioni in base a una combinazione di raggruppamento columns specificata nella clausolaGROUP BY
.CUBE
è una sintassi abbreviata perGROUPING SETS
. Ad esempio:GROUP BY warehouse, product WITH CUBE
o
GROUP BY CUBE(warehouse, product)
equivale a:
GROUP BY GROUPING SETS((warehouse, product), (warehouse), (product), ())
Mentre
GROUP BY CUBE(warehouse, product, location)
equivale a quanto segue:
GROUP BY GROUPING SETS((warehouse, product, location), (warehouse, product), (warehouse, location), (product, location), (warehouse), (product), (location), ())
Gli N elementi di una
CUBE
specifica generano 2^NGROUPING SETS
.aggregate_name
Nome di funzione di aggregazione (MIN, MAX, COUNT, SUM, AVG e così via).
DISTINCT
Rimuove i duplicati nelle righe di input prima che vengano passati alle funzioni di aggregazione.
FILTER
Filtra le righe di input per le quali nella
boolean_expression
WHERE
clausola restituisce true vengono passate alla funzione di aggregazione. Le altre righe vengono eliminate.
Analisi raggruppamento misto/annidato
Una clausola GROUP BY
può includere più group_expressions
e più CUBE
, ROLLUP
e GROUPING SETS
.
GROUPING SETS
può anche avere clausole annidate CUBE
, ROLLUP
, o GROUPING SETS
. Ad esempio:
GROUPING SETS(ROLLUP(warehouse, location),
CUBE(warehouse, location)),
GROUPING SETS(warehouse,
GROUPING SETS(location,
GROUPING SETS(ROLLUP(warehouse, location),
CUBE(warehouse, location))))
CUBE
ed ROLLUP
è solo lo zucchero sintassi per GROUPING SETS
.
Per informazioni su come tradurre CUBE
e ROLLUP
in GROUPING SETS
, vedere le sezioni precedenti.
group_expression
può essere considerato come un singolo gruppo GROUPING SETS
in questo contesto.
Per più GROUPING SETS
nella GROUP BY
clausola , Databricks SQL genera un singolo GROUPING SETS
oggetto eseguendo un prodotto incrociato dell'originale GROUPING SETS
.
Per annidato GROUPING SETS
nella GROUPING SETS
clausola , Databricks SQL accetta i set di raggruppamenti e li rimuove. Ad esempio, le query seguenti:
GROUP BY warehouse,
GROUPING SETS((product), ()),
GROUPING SETS((location, size),
(location),
(size),
());
GROUP BY warehouse,
ROLLUP(product),
CUBE(location, size);
sono equivalenti ai seguenti:
GROUP BY GROUPING SETS( (warehouse, product, location, size),
(warehouse, product, location),
(warehouse, product, size),
(warehouse, product),
(warehouse, location, size),
(warehouse, location),
(warehouse, size),
(warehouse))
Mentre
GROUP BY GROUPING SETS(GROUPING SETS(warehouse),
GROUPING SETS((warehouse, product)))`
equivale a
GROUP BY GROUPING SETS((warehouse),
(warehouse, product))`.
Esempi
CREATE TEMP VIEW dealer (id, city, car_model, quantity) AS
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 dealers in 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
-- Count the number of distinct dealers in cities per car_model, using GROUP BY ALL
> SELECT car_model, count(DISTINCT city) AS count FROM dealer GROUP BY ALL;
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 TEMP VIEW person (id, name, age) AS
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