RANK

RANK

정렬된 값 그룹 안에서 값의 순위(rank)를 반환하는 윈도우 함수예요. 순위는 1에서 시작해 순차적으로 계속됩니다.

출처: Snowflake SQL Reference

본문

두 값이 같으면 같은 순위를 가져요.

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

함수 자체는 인자를 받지 않아요. <expr2>로 정렬된 윈도우 안에서 현재 행의 순위(상대 위치)를 반환하기 때문이에요. 윈도우의 정렬이 순위를 결정하므로 RANK 함수에 추가 파라미터를 넘길 필요가 없어요.

사용 메모

  • expr1 — 윈도우를 파티션으로 나눌 컬럼 또는 표현식. 예를 들어 주(state)별로 옥수수 생산량 순위를 매기려면 주로 파티션을 나눠요. 단일 그룹만 원하면 PARTITION BY 절을 생략해요.
  • expr2 — 순위를 매길(정렬할) 컬럼 또는 표현식. 예: bushels_produced.
  • 동률(tie) 값은 같은 순위를 가지지만, 그로 인해 시퀀스에 공백(gap)이 생겨요. 예를 들어 처음 세 행이 1이면 RANK는 2와 3을 건너뛰고 다음 행에 4를 부여해요.
  • 공백을 피하려면 DENSE_RANK 함수를 대신 사용하세요.

예시 — 주별(파티션)로 옥수수 생산량을 내림차순으로 순위를 매겨요.

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로, 3등 동률이 있어도 4등이 건너뛰지 않아요.

INSERT INTO corn_production (farmer_id, state, bushels) VALUES
  (5, 'Iowa', 110);

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 |
+--------+---------+-------------------------------------+-------------------------------------------+

더 알아보기 (Learn more)