Compartir vía


Cláusula SORT BY

Se aplica a:casilla marcada como Sí Databricks SQL casilla marcada como Sí Databricks Runtime

Devuelve las filas del resultado ordenadas dentro de cada partición, según el criterio especificado por el usuario. Cuando hay más de una partición, puede que SORT BY devuelva un resultado que esté ordenado de forma parcial. Esta cláusula es distinta de ORDER BY, que garantiza un orden total de la salida.

Sintaxis

SORT BY { expression [ sort_direction nulls_sort_oder ] } [, ...]

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parámetros

  • expression

    Expresión de cualquier tipo que se usa para establecer un orden local de partición en el que se devuelven los resultados.

    Si la expresión es un valor INT literal, se interpreta como una posición de columna en la lista de selección.

  • sort_direction

    Especifica el criterio de ordenación para el orden por expresión.

    • ASC: la dirección de ordenación de esta expresión es ascendente.
    • DESC: el criterio de ordenación de esta expresión es descendente.

    Si no se especifica explícitamente la dirección de ordenación de las filas, el orden es ascendente de manera predeterminada.

  • nulls_sort_order

    También puede especificar si se devuelven valores NULL antes o después de valores distintos de NULL. Si no se especifica null_sort_order, los valores NULL se ordenan primero si el criterio de ordenación es ASC; si el criterio de ordenación es DESC, se ordenan al final.

    • NULLS FIRST: los valores NULL se devuelven primero independientemente del criterio de ordenación.
    • NULLS LAST: los valores NULL se devuelven primero independientemente del criterio de ordenación.

Cuando se especifica más de una expresión, se ordena de izquierda a derecha. Todas las filas de la partición se ordenan a partir de la primera expresión. Si hay valores duplicados para la primera expresión, la segunda expresión se usa para resolver el orden dentro del grupo de duplicados, y así sucesivamente. El orden resultante no es determinista si hay valores duplicados en todas las expresiones de orden.

Ejemplos

> 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