Freigeben über


SORT BY-Klausel

Gilt für: durch Häkchen mit „Ja“ markiert Databricks SQL durch Häkchen mit „Ja“ markiert Databricks Runtime

Gibt die Ergebniszeilen zurück, die innerhalb jeder Partition in der vom Benutzer angegebenen Reihenfolge sortiert sind. Wenn es mehrere Partitionen gibt, wird mit SORT BY das Ergebnis möglicherweise teilweise geordnet zurückgegeben. Dies funktioniert anders als die ORDER BY-Klausel, die eine Gesamtordnung der Ausgabe garantiert.

Syntax

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parameter

  • expression

    Ausdruck eines beliebigen Typs, der zum Festlegen einer lokalen Partitionsreihenfolge verwendet wird, in der die Ergebnisse zurückgegeben werden.

    Wenn der Ausdruck ein INT-Literal ist, wird er als Spaltenposition in der Auswahlliste interpretiert.

  • sort_direction

    Gibt die Sortierreihenfolge für die Sortierung nach Ausdruck an.

    • ASC: Die Sortierrichtung für diesen Ausdruck ist „aufsteigend“.
    • DESC: Die Sortierrichtung für diesen Ausdruck ist „absteigend“.

    Wird die Sortierrichtung nicht explizit angegeben, werden Zeilen standardmäßig aufsteigend sortiert.

  • nulls_sort_order

    Gibt optional an, ob NULL-Werte vor/nach Nicht-NULL-Werten zurückgegeben werden. Wird null_sort_order nicht angegeben, werden NULL-Werte bei der Sortierreihenfolge ASC zuerst und bei der Sortierreihenfolge DESC zuletzt aufgeführt.

    • NULLS FIRST: NULL-Werte werden unabhängig von der Sortierreihenfolge zuerst zurückgegeben.
    • NULLS LAST: NULL-Werte werden unabhängig von der Sortierreihenfolge zuletzt zurückgegeben.

Wenn Sie mehr als einen Ausdruck angeben, erfolgt die Sortierung von links nach rechts. Alle Zeilen innerhalb der Partition werden nach dem ersten Ausdruck sortiert. Wenn für den ersten Ausdruck doppelte Werte vorhanden sind, wird der zweite Ausdruck verwendet, um die Reihenfolge innerhalb der Gruppe von Duplikaten usw. zu bestimmen. Die resultierende Reihenfolge ist nicht deterministisch, wenn in der gesamten Sortierung nach Ausdrücken doppelte Werte vorhanden sind.

Beispiele

> 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