DENSE_RANK
DENSE_RANK (연속 순위)
값 그룹 안에서 값의 순위를, 순위 사이에 공백(gap) 없이 반환해요.
본문
순위 값은 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 |
+--------+---------+-------------------------------------+-------------------------------------------+