предложение SORT BY
Область применения: Databricks SQL
Databricks Runtime
Возвращает строки результатов, отсортированные в каждой секции Spark в указанном пользователе порядке.
Если данные распределяется по нескольким секциям Spark, SORT BY
может вернуть частично упорядоченный результат.
Чтобы явно контролировать разделение данных на секции Spark, используйте REPARTITION hint
.
Это отличается от предложения ORDER BY, которое гарантирует полностью упорядоченные выходные данные независимо от того, как Spark разделяет данные.
Синтаксис
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 возвращаются последними независимо от порядка сортировки.
-
Если указано несколько выражений для сортировки, они применяются в порядке слева направо. Все строки в секции Spark отсортированы по первому выражению. Если для первого выражения есть повторяющиеся значения, то используется второе выражение для разрешения порядка в группе дублирующихся значений, и так далее. Результирующий порядок не детерминирован, если между всеми выражениями имеются повторяющиеся значения.
Примеры
> 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