Partilhar via


Cláusula SORT BY

Aplica-se a: Marque Sim Databricks SQL Marque Sim Databricks Runtime

Retorna as linhas de resultados classificadas dentro de 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

  • expressão

    Uma expressão de qualquer tipo usada para estabelecer uma ordem local de partição 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 a classificação por expressão.

    • ASC: A direção de classificação para esta expressão é ascendente.
    • DESC: A ordem de classificação para esta 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 os valores NULL são retornados antes/depois de valores não-NULL. Se null_sort_order não for especificado, NULLs ordenará primeiro se a ordem de classificação for e ASC NULLS ordenará por último se a ordem de classificação for DESC.

    • NULLS FIRST: Os valores NULL são retornados primeiro, independentemente da ordem de classificação.
    • NULLS LAST: Os valores NULL sã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 duplicatas e assim por diante. A ordem resultante não é determinística se houver valores duplicados em toda a ordem por expressões.

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