- 카테고리:
윈도우 함수 (순위 지정)
RANK¶
정렬된 값 그룹 내의 값에 대한 순위를 반환합니다.
순위 값은 1에서 시작하여 순차적으로 계속됩니다.
두 값이 같으면 순위가 같습니다.
구문¶
RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
자세한 window_frame
구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.
인자¶
함수 자체는 인자를 사용하지 않습니다. <expr2>
에 의해 정렬된 윈도우 내 현재 행의 순위(상대 위치)를 반환하기 때문입니다. 윈도우의 순서에 따라 순위가 결정되므로 RANK 함수에 추가 매개 변수를 전달할 필요가 없습니다.
사용법 노트¶
expr1
윈도우의 분할 기준이 되는 열 또는 식입니다.예를 들어, 각각의 주 또는 도 내에서 농부의 옥수수 생산량에 따라 순서대로 농부의 순위를 매기려고 한다고 가정합니다. 이 경우, 주를 기준으로 분할합니다.
단일 그룹만 원하는 경우(예: 해당 농부가 거주하는 주와 관계없이 미국 내 모든 농부의 순위를 매기려는 경우), PARTITION BY 절을 생략하십시오.
expr2
정렬(순위 지정) 기준이 되는 열 또는 식입니다.예를 들어, 농부의 순위를 매겨 누가 가장 많은 옥수수를 생산했는지(해당 주 내의 생산량) 보려면
bushels_produced
열을 사용합니다. 자세한 내용은 이 항목에 있는 예 를 참조하십시오.동점 값은 동일한 순위 값으로 나타납니다. 그러나 동점 값으로 인해 시퀀스에서 공백이 생깁니다.
예를 들어, 처음 세 행이
1
을 반환하면 RANK 는2
및3
을 건너뛰고 그룹의 다음 행에4
를 할당합니다.공백을 피하려면 대신 DENSE_RANK 함수를 사용하십시오.
예¶
테이블과 데이터를 만듭니다.
-- Create table and load data.
create or replace table corn_production (farmer_ID INTEGER, state varchar, bushels float);
insert into corn_production (farmer_ID, state, bushels) values
(1, 'Iowa', 100),
(2, 'Iowa', 110),
(3, 'Kansas', 120),
(4, 'Kansas', 130);
농부의 옥수수 생산량을 내림차순으로 표시하고 각 농부의 생산량에 대해 순위를 매깁니다(최고 = 1
).
SELECT state, bushels,
RANK() OVER (ORDER BY bushels DESC),
DENSE_RANK() OVER (ORDER BY bushels DESC)
FROM corn_production;
+--------+---------+-------------------------------------+-------------------------------------------+
| STATE | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) |
|--------+---------+-------------------------------------+-------------------------------------------|
| Kansas | 130 | 1 | 1 |
| Kansas | 120 | 2 | 2 |
| Iowa | 110 | 3 | 3 |
| Iowa | 100 | 4 | 4 |
+--------+---------+-------------------------------------+-------------------------------------------+
각 주 내에서 농부의 옥수수 생산량을 각 개별 농부의 생산량 순위와 함께 내림차순으로 표시합니다(최고 = 1
).
SELECT state, bushels,
RANK() OVER (PARTITION BY state ORDER BY bushels DESC),
DENSE_RANK() OVER (PARTITION BY state ORDER BY bushels DESC)
FROM corn_production;
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
| STATE | BUSHELS | RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) |
|--------+---------+--------------------------------------------------------+--------------------------------------------------------------|
| Iowa | 110 | 1 | 1 |
| Iowa | 100 | 2 | 2 |
| Kansas | 130 | 1 | 1 |
| Kansas | 120 | 2 | 2 |
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
아래 쿼리 및 출력은 RANK 및 DENSE_RANK 함수가 동점 값을 처리하는 방법을 보여줍니다. DENSE_RANK의 경우, 순위는 1
, 2
, 3
, 3
, 4
입니다. RANK 함수의 출력과 달리, 3
위에 대한 동점 때문에 4
위를 건너뛰지는 않습니다.
SELECT state, bushels,
RANK() OVER (ORDER BY bushels DESC),
DENSE_RANK() OVER (ORDER BY bushels DESC)
FROM corn_production;
+--------+---------+-------------------------------------+-------------------------------------------+
| STATE | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) |
|--------+---------+-------------------------------------+-------------------------------------------|
| Kansas | 130 | 1 | 1 |
| Kansas | 120 | 2 | 2 |
| Iowa | 110 | 3 | 3 |
| Iowa | 110 | 3 | 3 |
| Iowa | 100 | 5 | 4 |
+--------+---------+-------------------------------------+-------------------------------------------+