Condividi tramite


clausola SORT BY

Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime

Restituisce le righe dei risultati ordinate all'interno di ogni partition nell'ordine specificato dall'utente. Quando sono presenti più partitionSORT BY possono restituire risultati parzialmente ordinati. Questo comportamento è diverso dalla clausola ORDER BY, che garantisce un ordine totale dell'output.

Sintassi

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parameters

  • expression

    Un'espressione di qualsiasi tipo utilizzata per stabilire un ordine locale partition in cui vengono restituiti i risultati.

    Se l'espressione è un valore INT letterale, viene interpretata come una posizione column nel selectlist.

  • sort_direction

    Specifica l'ordinamento per l'espressione di ordinamento.

    • ASC: la direzione di ordinamento per questa espressione è crescente.
    • DESC: l'ordinamento per questa espressione è decrescente.

    Se la direzione di ordinamento non viene specificata in modo esplicito, per impostazione predefinita le righe vengono ordinate in ordine crescente.

  • nulls_sort_order

    Specifica in modo facoltativo se i values NULL sono restituiti prima o dopo i valuesnon NULL. Se null_sort_order non viene specificato, gli NUL ordinano prima se l'ordinamento è ASC e NULLS ordinano per ultimo se l'ordinamento è DESC.

    • NULLS FIRST: i values NULL vengono restituiti per primi indipendentemente dall'ordinamento.
    • NULLS LAST: i values NULL vengono restituiti per ultimo indipendentemente dall'ordinamento.

Quando si specificano più espressioni di ordinamento si verifica da sinistra a destra. Tutte le righe all'interno del partition vengono ordinate in base alla prima espressione. Se sono presenti values duplicati per la prima espressione, viene usata la seconda espressione per risolvere l'ordine all'interno del gruppo di duplicati e così via. L'ordine risultante non è deterministico se ci sono duplicati values in tutte le espressioni di ordinamento.

Esempi

> 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