SORT BY, clause

S’applique à :case marquée oui Databricks SQL case marquée oui Databricks Runtime

Renvoie les lignes de résultats triées dans chaque partition dans l’ordre spécifié par l’utilisateur. Lorsqu’il existe plusieurs partitions SORT BY, un résultat peut être partiellement trié. Cela diffère de la clause ORDER BY qui garantit un ordre total de la sortie.

Syntaxe

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Paramètres

  • expression

    Expression de n’importe quel type permettant d’établir un ordre de partition locale dans lequel les résultats sont retournés.

    Si l’expression est une valeur de type INT littérale, elle est interprétée comme une position de colonne dans la liste de sélection.

  • sort_direction

    Spécifie l’ordre de tri pour l’expression sort by.

    • ASC : la direction de tri est croissant pour cette expression.
    • DESC : l’ordre de tri est croissant pour cette expression.

    Si l’ordre de tri n’est pas spécifié explicitement, les lignes par défaut sont triées par ordre croissant.

  • nulls_sort_order

    Spécifie si les valeurs NULL sont renvoyées avant/après les valeurs non NULL. Si null_sort_order n’est pas spécifié, les valeurs NULL sont triées en premier si l’ordre de tri est ASC et les valeurs NULL sont triées en dernier si l’ordre de tri est DESC.

    • NULLS FIRST : les valeurs NULL sont retournées en premier indépendamment de l’ordre de tri.
    • NULLS LAST : les valeurs NULL sont retournées en dernier indépendamment de l’ordre de tri.

Lorsque vous spécifiez plusieurs expressions, le tri s’effectue de gauche à droite. Toutes les lignes de la partition sont triées selon la première expression. S’il existe des valeurs en double pour la première expression, la deuxième expression est utilisée pour résoudre l’ordre dans le groupe de doublons et ainsi de suite. L’ordre qui en résulte n’est pas déterministe s’il existe des valeurs en double dans toutes les expressions order by.

Exemples

> 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