Clausola SORT BY
Si applica a: Databricks SQL Databricks Runtime
Restituisce le righe dei risultati ordinate all'interno di ogni partizione nell'ordine specificato dall'utente. Quando è presente più di una partizione SORT BY
, è possibile che venga restituito un risultato parzialmente ordinato. Questa operazione è diversa dalla clausola ORDER BY che garantisce un ordine totale dell'output.
Sintassi
SORT BY { expression [ sort_direction nulls_sort_oder ] } [, ...]
sort_direction
[ ASC | DEC ]
nulls_sort_order
[ NULLS FIRST | NULLS LAST ]
Parametri
-
Espressione di qualsiasi tipo utilizzato per stabilire un ordine locale di partizione in cui vengono restituiti i risultati.
Se l'espressione è un valore INT letterale, viene interpretata come una posizione di colonna nell'elenco di selezione.
sort_direction
Specifica l'ordinamento per l'espressione di ordinamento.
ASC
: la direzione di ordinamento per questa espressione è crescente.DESC
: l'ordinamento per questa espressione è decrescente.
Se la direzione di ordinamento non viene specificata in modo esplicito, per impostazione predefinita le righe vengono ordinate in ordine crescente.
nulls_sort_order
Specifica facoltativamente se i valori NULL vengono restituiti prima o dopo valori non NULL. Se
null_sort_order
non viene specificato, gli NUL ordinano prima se l'ordinamento èASC
e NULLS ordinano per ultimo se l'ordinamento èDESC
.NULLS FIRST
: i valori NULL vengono restituiti per primi indipendentemente dall'ordinamento.NULLS LAST
: i valori NULL vengono restituiti per ultimo indipendentemente dall'ordinamento.
Quando si specificano più espressioni di ordinamento si verifica da sinistra a destra. Tutte le righe all'interno della partizione vengono ordinate in base alla prima espressione. Se sono presenti valori duplicati per la prima espressione, viene usata la seconda espressione per risolvere l'ordine all'interno del gruppo di duplicati e così via. L'ordine risultante non deterministico se sono presenti valori duplicati in tutti gli ordini in base alle espressioni.
Esempi
> CREATE TEMP VIEW person (zip_code, name, age)
AS VALUES (94588, 'Zen Hui', 50),
(94588, 'Dan Li', 18),
(94588, 'Anil K', 27),
(94588, 'John V', NULL),
(94511, 'David K', 42),
(94511, 'Aryan B.', 18),
(94511, 'Lalit B.', NULL);
-- Use `REPARTITION` hint to partition the data by `zip_code` to
-- examine the `SORT BY` behavior. This is used in rest of the
-- examples.
-- Sort rows by `name` within each partition in ascending manner
> SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
SORT BY name;
Anil K 27 94588
Dan Li 18 94588
John V NULL 94588
Zen Hui 50 94588
Aryan B. 18 94511
David K 42 94511
Lalit B. NULL 94511
-- Sort rows within each partition using column position.
> SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
SORT BY 1;
Anil K 27 94588
Dan Li 18 94588
John V null 94588
Zen Hui 50 94588
Aryan B. 18 94511
David K 42 94511
Lalit B. null 94511
-- Sort rows within partition in ascending manner keeping null values to be last.
> SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person
SORT BY age NULLS LAST;
18 Dan Li 94588
27 Anil K 94588
50 Zen Hui 94588
NULL John V 94588
18 Aryan B. 94511
42 David K 94511
NULL Lalit B. 94511
-- Sort rows by age within each partition in descending manner, which defaults to NULL LAST.
> SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person
SORT BY age DESC;
50 Zen Hui 94588
27 Anil K 94588
18 Dan Li 94588
NULL John V 94588
42 David K 94511
18 Aryan B. 94511
NULL Lalit B. 94511
-- Sort rows by age within each partition in descending manner keeping null values to be first.
> SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person
SORT BY age DESC NULLS FIRST;
NULL John V 94588
50 Zen Hui 94588
27 Anil K 94588
18 Dan Li 94588
NULL Lalit B. 94511
42 David K 94511
18 Aryan B. 94511
-- Sort rows within each partition based on more than one column with each column having
-- different sort direction.
> SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
SORT BY name ASC, age DESC;
Anil K 27 94588
Dan Li 18 94588
John V null 94588
Zen Hui 50 94588
Aryan B. 18 94511
David K 42 94511
Lalit B. null 94511