Dela via


SORT BY-sats

Gäller för:markerad ja Databricks SQL markerad ja Databricks Runtime

Returnerar de resultatrader som sorteras inom varje partition i den angivna användarordningen. När det finns fler än en partitionkanSORT BY returnera resultat som delvis är ordnade. Detta skiljer sig från ORDER BY-satsen som garanterar en total ordning på utdata.

Syntax

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parameters

  • uttryck

    Ett uttryck av vilken som helst typ som används för att upprätta en partition lokal ordning där resultaten returneras.

    Om uttrycket är ett literalt INT-värde tolkas det som en column position i selectlist.

  • sort_direction

    Anger sorteringsordningen för sorteringen efter uttryck.

    • ASC: Sorteringsriktningen för det här uttrycket är stigande.
    • DESC: Sorteringsordningen för det här uttrycket är fallande.

    Om sorteringsriktningen inte uttryckligen anges sorteras raderna som standard stigande.

  • nulls_sort_order

    Du kan ange om NULL-values returneras före/efter icke-NULL-values. Om null_sort_order inte har angetts sorteras NULL:er först om sorteringsordningen är ASC och NULLS-sortering senast om sorteringsordningen är DESC.

    • NULLS FIRST: NULL-values returneras först oavsett sorteringsordning.
    • NULLS LAST: NULL-values returneras sist oavsett sorteringsordning.

När du anger fler än ett uttryck sker sortering från vänster till höger. Alla rader i partition sorteras efter det första uttrycket. Om det finns duplicerade values för det första uttrycket används det andra uttrycket för att fastställa ordningen inom gruppen av dubbletter och så vidare. Den resulterande ordningen är inte deterministisk om det finns duplicerade values i alla sorteringsuttryck.

Exempel

> 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