RANK
RANK
정렬된 값 그룹 안에서 값의 순위(rank)를 반환하는 윈도우 함수예요. 순위는 1에서 시작해 순차적으로 계속됩니다.
본문
두 값이 같으면 같은 순위를 가져요.
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 |
+--------+---------+-------------------------------------+-------------------------------------------+