SORT BY-component (Databricks SQL)

Retourneert de resultaatrijen die zijn gesorteerd binnen elke partitie in de door de gebruiker opgegeven volgorde. Wanneer er meer dan één partitie is, SORT BY kan dit resultaat retourneren dat gedeeltelijk is geordend. Dit is anders dan de ORDER BY-component die een totale volgorde van de uitvoer garandeert.

Syntaxis

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parameters

  • Expressie

    Een expressie van elk type dat wordt gebruikt om een lokale partitieorder tot stand te brengen waarin resultaten worden geretourneerd.

    Als de expressie een letterlijke INT-waarde is, wordt deze geïnterpreteerd als een kolompositie in de selectielijst.

  • sort_direction

    Hiermee geeft u de sorteer volgorde voor de sorteren op expressie.

    • ASC: De sorteerrichting voor deze expressie is oplopend.
    • DESC: De sorteer volgorde voor deze expressie is aflopend.

    Als de sorteerrichting niet expliciet is opgegeven, worden rijen standaard oplopend gesorteerd.

  • nulls_sort_order

    Hiermee kunt u desgewenst bepalen of NULL-waarden worden geretourneerd vóór/na niet-NULL-waarden. Als niet is opgegeven, sorteren nulls eerst als de sorteerorder is en null_sort_orderASC sorteren NULLS als laatste als de sorteerorde DESC is.

    • NULLS FIRST: NULL-waarden worden eerst geretourneerd, ongeacht de sorteer volgorde.
    • NULLS LAST: NULL-waarden worden het laatst geretourneerd, ongeacht de sorteer volgorde.

Bij het opgeven van meer dan één expressie vindt sorteren van links naar rechts plaats. Alle rijen in de partitie worden gesorteerd op de eerste expressie. Als er dubbele waarden voor de eerste expressie zijn, wordt de tweede expressie gebruikt om de volgorde in de groep duplicaten op te lossen, en meer. De resulterende volgorde is niet deterministisch als er dubbele waarden zijn in alle volgorde op expressies.

Voorbeelden

> 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