DENSE_RANK

DENSE_RANK (연속 순위)

값 그룹 안에서 값의 순위를, 순위 사이에 공백(gap) 없이 반환해요.

출처: Snowflake SQL Reference - DENSE_RANK

본문

순위 값은 1에서 시작해 순차적으로 계속 증가해요.

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

구문

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

자세한 window_frame 구문은 Window function syntax and usage를 참고하세요.

인자

없음.

이 함수는 <expr2>로 정렬되는 윈도우 안에서 현재 행의 순위(상대 위치)를 반환하므로 자체적으로는 인자를 받지 않아요. 윈도우의 정렬이 순위를 결정하므로 DENSE_RANK 함수에 추가 매개변수를 전달할 필요가 없어요.

사용 시 참고 사항

  • expr1 윈도우를 파티션으로 나눌 열 또는 표현식이에요.

    예를 들어 각 주(州) 또는 도(道) 안에서 농부들을 그들이 생산한 옥수수 양 순서대로 순위를 매기고 싶다고 가정해요. 이 경우 주(state)로 파티션을 나눠요.

    단일 그룹만 원한다면(예: 미국의 모든 농부를 어느 주에 살든 상관없이 순위를 매기고 싶다면) PARTITION BY 절을 생략하세요.

  • expr2 순위를 매길 기준인 열 또는 표현식이에요.

    예를 들어 농부들이 (자기 주 안에서) 누가 가장 많은 옥수수를 생산했는지 보려고 순위를 매긴다면 bushels_produced 열을 사용하면 돼요. 자세한 내용은 (이 주제의) 예시를 참고하세요.

  • 동률(tie) 값은 같은 순위 값을 만들지만, RANK와 달리 순서에 공백(gap)이 생기지 않아요.

예시

테이블과 데이터를 만들어요.

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는 건너뛰지 않아요.

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

더 알아보기