SORT BY 句

適用対象: 「はい」のチェック マーク Databricks SQL 「はい」のチェック マーク Databricks Runtime

各パーティション内でユーザーが指定した順序で並べ替えられた結果行を返します。 パーティションが複数ある場合、SORT BY では、一部が並べ替えられた結果を返す場合があります。 これは、出力のすべての順序が保証される ORDER BY 句とは異なります。

構文

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

パラメーター

  • expression

    結果を返す、パーティションのローカル順序を確立するために使用する式 (型は任意)。

    式がリテラルの INT 値の場合、選択リスト内の列の位置と解釈されます。

  • sort_direction

    sort by 式の並べ替え順序を指定します。

    • ASC: この式の並べ替え方向は昇順です。
    • DESC: この式の並べ替え方向は降順です。

    並べ替えの方向が明示的に指定されていない場合、既定では行が昇順に並べ替えられます。

  • nulls_sort_order

    Null 値を非 Null 値の前に返すか後に返すかを指定します (省略可能)。 null_sort_order が指定されていない場合、並べ替え順序が ASC の場合は最初に NULL が並べ替えられ、並べ替え順序が DESC の場合は最後に NULL が並べ替えられます。

    • NULLS FIRST: 並べ替え順序に関係なく、最初に NULL 値が返されます。
    • NULLS LAST: 並べ替え順序に関係なく、最後に NULL 値が返されます。

複数の式の並べ替えを指定する場合は、左から右に並べ替えられます。 パーティション内のすべての行は、最初の式によって並べ替えられます。 1 つ目の式に重複する値がある場合は、2 番目の式を使用して、重複するグループ内の順序を解決します。 すべての order by 式で重複する値がある場合、結果の順序は決定論的ではありません。

> 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