RANK()는 순위(랭킹)를 매겨주는 윈도우 함수입니다.
SQL에서 "TOP N", "상위/하위 순위" 같은 분석을 할 때 가장 자주 쓰여요.
RANK() OVER (
[PARTITION BY 그룹기준컬럼] -- 선택: 그룹별로 순위 매기기
ORDER BY 정렬기준컬럼 [ASC|DESC] -- 필수: 무엇을 기준으로 순위를 매길지
)
SELECT
user_id AS 유저ID
, COUNT(*) AS 총_거래건수
, RANK() OVER (ORDER BY COUNT(*) DESC) AS 순위
FROM
transactions
WHERE
transaction_dt >= DATE'2025-01-01'
AND transaction_dt < DATE'2025-05-01'
GROUP BY
user_id
ORDER BY
순위
;
결과 예시:
| 유저ID | 총_거래건수 | 순위 |
| A | 120 | 1 |
| B | 95 | 2 |
| C | 95 | 2 ← 동률 |
| D | 80 | 4 ← 3위 건너뜀 |
| E | 75 | 5 |
세 함수 모두 순위를 매기지만 동률 처리 방식이 달라요.
| 점수 | RANK() | DENSE_RANK() | ROW_NUMBER() |
| 100 | 1 | 1 | 1 |
| 95 | 2 | 2 | 2 |
| 95 | 2 | 2 | 3 |
| 90 | 4 | 3 | 4 |
| 85 | 5 | 4 | 5 |
전체가 아니라 카테고리별 순위를 매기고 싶을 때 사용합니다. 예: 제휴사별로 거래액 상위 회원 순위.
SELECT
partner_id AS 제휴사ID
, user_id AS 유저ID
, SUM(amount) AS 총_거래금액
, RANK() OVER (
PARTITION BY partner_id
ORDER BY SUM(amount) DESC
) AS 제휴사내_순위
FROM
transactions
WHERE
transaction_dt >= DATE'2025-01-01'
AND transaction_dt < DATE'2025-05-01'
GROUP BY
partner_id, user_id
ORDER BY
제휴사ID, 제휴사내_순위
;
결과 예시:
| 제휴사ID | 유저ID | 총_거래금액 | 제휴사내_순위 |
| P001 | A | 50000 | 1 |
| P001 | B | 30000 | 2 |
| P001 | C | 20000 | 3 |
| P002 | D | 80000 | 1 ← 다시 1부터 |
| P002 | E | 45000 | 2 |
RANK()는 SELECT 절에서 바로 WHERE로 못 거릅니다 (윈도우 함수는 WHERE보다 나중에 계산되기 때문).
그래서 서브쿼리/CTE로 감싼 뒤 WHERE에 조건을 거는 패턴을 자주 씁니다.
SELECT
제휴사ID
, 유저ID
, 총_거래금액
, 제휴사내_순위
FROM (
SELECT
partner_id AS 제휴사ID
, user_id AS 유저ID
, SUM(amount) AS 총_거래금액
, RANK() OVER (
PARTITION BY partner_id
ORDER BY SUM(amount) DESC
) AS 제휴사내_순위
FROM
transactions
WHERE
transaction_dt >= DATE'2025-01-01'
AND transaction_dt < DATE'2025-05-01'
GROUP BY
partner_id, user_id
) t
WHERE
제휴사내_순위 <= 3 -- 제휴사별 TOP 3만
ORDER BY
제휴사ID, 제휴사내_순위
;
CUBRID도 표준 SQL 윈도우 함수를 지원하니 위 문법 그대로 사용 가능합니다.

| sql 쿼리에서 count(if(~)), if(count(~)) 순서 차이 (0) | 2026.04.15 |
|---|---|
| SQL 큐브리드 테이블 간 차집합 difference 위,아래 순서 차이 (0) | 2026.01.16 |
| 큐브리드 ini 설정파일 수정, 데이터 추출 성능 개선하기 (0) | 2026.01.14 |
| mysql 조건에서 in 절에는 몇 개까지 넣을 수 있을까? (1) | 2026.01.14 |
| SUM(DECODE(SIGN(point), 1, 1, 0)) 해당 쿼리 뜻은? (0) | 2026.01.14 |