SORT BY 절
적용 대상: Databricks SQL Databricks 런타임
사용자가 지정한 순서로 각 파티션 내에서 정렬된 결과 행을 반환합니다. 둘 이상의 파티션이 있는 경우 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
Srder by 식의 정렬 순서를 지정합니다.
ASC
: 이 식의 정렬 방향이 오름차순입니다.DESC
: 이 식의 정렬 순서가 내림차순입니다.
정렬 방향이 명시적으로 지정되지 않으면 기본적으로 행이 오름차순으로 정렬됩니다.
nulls_sort_order
선택적으로 NULL이 아닌 값 앞/뒤에 NULL 값이 반환되는지 여부를 지정합니다.
null_sort_order
를 지정하지 않으면 정렬 순서가ASC
이면 NULL이 먼저 정렬되고 정렬 순서가DESC
이면 NULL이 마지막으로 정렬됩니다.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