- 카테고리:
윈도우 함수 (순위 관련, 윈도우 프레임)
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 | +--------+---------+-------------------------------------+-------------------------------------------+