SORT BY句
説明
SORT BY 句は、ユーザー指定の順序で各パーティション内の結果行をソートして返すために使用されます。複数のパーティションがある場合、SORT BY は部分的に順序付けされた結果を返す可能性があります。これは、出力の全体的な順序を保証する ORDER BY 句とは異なります。
構文
SORT BY { expression [ sort_direction | nulls_sort_order ] [ , ... ] }
パラメータ
-
SORT BY
各パーティション内の行をソートするために使用される、オプションのパラメータ
sort_directionおよびnulls_sort_orderと共に、カンマ区切りの式のリストを指定します。 -
sort_direction
昇順または降順で行をソートするかどうかをオプションで指定します。ソート方向の有効な値は、昇順の場合は
ASC、降順の場合はDESCです。ソート方向が明示的に指定されていない場合、デフォルトでは行は昇順にソートされます。構文:
[ ASC | DESC ] -
nulls_sort_order
NULL 値が非 NULL 値の前または後に返されるかをオプションで指定します。
null_sort_orderが指定されていない場合、ソート順序がASCの場合は NULL が最初にソートされ、ソート順序がDESCの場合は NULL が最後にソートされます。NULLS FIRSTが指定されている場合、ソート順序に関係なく NULL 値が最初に返されます。NULLS LASTが指定されている場合、ソート順序に関係なく NULL 値が最後に返されます。
構文:
[ NULLS { FIRST | LAST } ]
例
CREATE TABLE person (zip_code INT, name STRING, age INT);
INSERT INTO person 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;
+--------+----+--------+
| name| age|zip_code|
+--------+----+--------+
| 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;
+--------+----+--------+
| name| age|zip_code|
+--------+----+--------+
| 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;
+----+--------+--------+
| age| name|zip_code|
+----+--------+--------+
| 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;
+----+--------+--------+
| age| name|zip_code|
+----+--------+--------+
| 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;
+----+--------+--------+
| age| name|zip_code|
+----+--------+--------+
|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;
+--------+----+--------+
| name| age|zip_code|
+--------+----+--------+
| 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|
+--------+----+--------+