카테고리:

윈도우 함수 (순위 관련, 윈도우 프레임)

RANK

정렬된 값 그룹 내의 값에 대한 순위를 반환합니다.

순위 값은 1에서 시작하여 순차적으로 계속됩니다.

두 값이 같으면 순위가 같습니다.

구문

RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
Copy

window_frame 구문에 대한 자세한 내용은 윈도우 프레임 구문과 사용법 을 참조하십시오.

인자

없습니다.

함수 자체는 인자를 사용하지 않습니다. <expr2> 에 의해 정렬된 윈도우 내 현재 행의 순위(상대 위치)를 반환하기 때문입니다. 윈도우의 순서에 따라 순위가 결정되므로 RANK 함수에 추가 매개 변수를 전달할 필요가 없습니다.

사용법 노트

  • expr1 윈도우의 분할 기준이 되는 열 또는 식입니다.

    예를 들어, 각각의 주 또는 도 내에서 농부의 옥수수 생산량에 따라 순서대로 농부의 순위를 매기려고 한다고 가정합니다. 이 경우, 주를 기준으로 분할합니다.

    단일 그룹만 원하는 경우(예: 해당 농부가 거주하는 주와 관계없이 미국 내 모든 농부의 순위를 매기려는 경우), PARTITION BY 절을 생략하십시오.

  • expr2 정렬(순위 지정) 기준이 되는 열 또는 식입니다.

    예를 들어, 농부의 순위를 매겨 누가 가장 많은 옥수수를 생산했는지(해당 주 내의 생산량) 보려면 bushels_produced 열을 사용합니다. 자세한 내용은 이 항목에 있는 를 참조하십시오.

  • 동점 값은 동일한 순위 값으로 나타납니다. 그러나 동점 값으로 인해 시퀀스에서 공백이 생깁니다.

    예를 들어, 처음 세 행이 1 을 반환하면 RANK 는 23 을 건너뛰고 그룹의 다음 행에 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);
Copy

농부의 옥수수 생산량을 내림차순으로 표시하고 각 농부의 생산량에 대해 순위를 매깁니다(최고 = 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 |
+--------+---------+-------------------------------------+-------------------------------------------+
Copy

각 주 내에서 농부의 옥수수 생산량을 각 개별 농부의 생산량 순위와 함께 내림차순으로 표시합니다(최고 = 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 |
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
Copy

아래 쿼리 및 출력은 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 |
+--------+---------+-------------------------------------+-------------------------------------------+
Copy