Cláusula SORT BY
Aplica-se a: SQL do Databricks Runtime do Databricks
Retorna as linhas de resultado classificadas em cada partição na ordem especificada pelo usuário. Quando há mais de uma partição SORT BY
pode retornar o resultado que está parcialmente ordenado. Isso é diferente da cláusula ORDER BY, que garante uma ordem total da saída.
Sintaxe
SORT BY { expression [ sort_direction nulls_sort_oder ] } [, ...]
sort_direction
[ ASC | DEC ]
nulls_sort_order
[ NULLS FIRST | NULLS LAST ]
Parâmetros
-
Uma expressão de qualquer tipo usada para estabelecer uma ordem de partição local na qual os resultados são retornados.
Se a expressão for um valor INT literal, ela será interpretada como uma posição de coluna na lista de seleção.
sort_direction
Especifica a ordem de classificação para classificar por expressão.
ASC
: a direção da classificação para essa expressão é crescente.DESC
: a ordem de classificação para essa expressão é decrescente.
Se a direção de classificação não for especificada explicitamente, por padrão, as linhas serão classificadas em ordem crescente.
nulls_sort_order
Opcionalmente, especifica se valores NULL são retornados antes/depois de valores não NULL. Se
null_sort_order
não for especificado, os NULLs serão classificados primeiro se a ordem de classificação forASC
e classificados por último se a ordem de classificação forDESC
.NULLS FIRST
: os valores NULL serão retornados primeiro, independentemente da ordem de classificação.NULLS LAST
: os valores NULL serão retornados por último, independentemente da ordem de classificação.
Ao especificar mais de uma expressão a classificação ocorre da esquerda para a direita. Todas as linhas dentro da partição são classificadas pela primeira expressão. Se houver valores duplicados para a primeira expressão, a segunda expressão será usada para resolver a ordem dentro do grupo de duplicados e assim por diante. A ordem resultante não será determinística se houver valores duplicados em todas as expressões classificar por.
Exemplos
> 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