Предложение 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 ]
Параметры
-
Выражение любого типа, используемое для настройки локального порядка секций, в соответствии с которым возвращаются результаты.
Если выражение представляет собой литеральное значение INT, оно интерпретируется как расположение столбца в списке выбора.
sort_direction
Указывает порядок сортировки для выражения SORT BY.
ASC
: направление сортировки "по возрастанию" для этого выражения.DESC
: направление сортировки "по убыванию" для этого выражения.
Если направление сортировки не указано явно, по умолчанию строки сортируются по возрастанию.
nulls_sort_order
Необязательный параметр, который определяет, возвращаются ли значения NULL перед и после значений, отличных от NULL. Если параметр
null_sort_order
не указан, то значения NULL сортируются в начале, когда порядок сортировки имеет значениеASC
, или в конце, когда для порядка сортировки задано значениеDESC
.NULLS FIRST
означает, что значения NULL возвращаются первыми независимо от порядка сортировки.NULLS LAST
означает, что значения NULL возвращаются последними независимо от порядка сортировки.
Если указано несколько выражений для сортировки, они применяются в порядке слева направо. Все строки в пределах секции сортируются по первому выражению. При наличии повторяющихся значений для первого выражения используется второе выражение, чтобы определить порядок в каждой группе с повторяющимися значениями, и так далее. Результирующий порядок не детерминирован, если дублирующиеся значения сохранятся после применения всех выражений 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