Klausa SORTIR BERDASAR

Berlaku untuk:centang ditandai ya pemeriksaan Databricks SQL ditandai ya Databricks Runtime

Mengembalikan baris hasil yang diurutkan dalam setiap partisi dalam urutan yang ditentukan pengguna. Ketika ada lebih dari satu partisi SORT BY dapat mengembalikan hasil yang diurutkan sebagian. Ini berbeda dari klausa ORDER BY yang menjamin urutan total output.

Sintaks

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parameter

  • Ekspresi

    Ekspresi jenis apa pun yang digunakan untuk membuat urutan lokal partisi di mana hasil dikembalikan.

    Jika ekspresi adalah nilai INT harfiah, ekspresi ditafsirkan sebagai posisi kolom dalam daftar pilih.

  • sort_direction

    Menentukan urutan pengurutan untuk pengurutan menurut ekspresi.

    • ASC: Arah pengurutan untuk ekspresi ini naik.
    • DESC: Urutan pengurutan untuk ekspresi ini menurun.

    Jika arah pengurutan tidak ditentukan secara eksplisit, maka secara default baris diurutkan naik.

  • nulls_sort_order

    Secara opsional menentukan apakah nilai NULL dikembalikan sebelum/setelah nilai non-NULL. Jika null_sort_order tidak ditentukan, maka NULL mengurutkan terlebih dahulu jika urutan sortir adalah ASC dan NULLS mengurutkan terakhir jika urutan sortir adalah DESC.

    • NULLS FIRST: Nilai NULL dikembalikan terlebih dahulu terlepas dari urutan pengurutan.
    • NULLS LAST: Nilai NULL dikembalikan terakhir terlepas dari urutan pengurutan.

Saat menentukan lebih dari satu pengurutan ekspresi terjadi dari kiri ke kanan. Semua baris dalam partisi diurutkan menurut ekspresi pertama. Jika ada nilai duplikat untuk ekspresi pertama, ekspresi kedua digunakan untuk menyelesaikan urutan dalam grup duplikat dan sebagainya. Urutan yang dihasilkan tidak deterministik jika ada nilai duplikat di semua urutan menurut ekspresi.

Contoh

> 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