SQL

ROW_NUMBER() vs. RANK() vs. DENSE_RANK()

kimmalgu 2024. 9. 30. 18:09

1. ROW_NUMBER()

  • 고유한 순위를 부여
  • 동일한 값이 있어도 각 행에 고유한 번호가 매김
  • 건너뛰는 순위가 없음: 순위는 항상 연속적으로 증가
SELECT name, salary,
	ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM Employees;
name salary  row_num
Eve 7000 1
Frank 6500 2
David 6500 3
Bob 5000 4
Charlie 4000 5
Alice 3000 6
  •  Frank와 David의 급여가 같지만, ROW_NUMBER()는 이들에게 서로 다른 고유한 순위를 부여

 

2. RANK()

  • 동일한 값이 있을 경우 같은 순위를 부여
  • 동일한 순위가 부여된 후에는 그 다음 순위가 건너뜀
SELECT name, salary,
	RANK() OVER (ORDER BY salary DESC) AS rank
FROM Employees;
name salary rank
Eve 7000 1
Frank 6500 2
David 6500 2
Bob 5000 4
Charlie 4000 5
Alice 3000 6
  • Frank와 David의 급여가 같으므로 둘 다 2위를 받음
  • 그 다음 순위는 4위가 되고, 3위는 건너뜀

 

 

3. DENSE_RANK()

  • 동일한 값에 동일한 순위를 부여
  • 하지만 그 다음 순위는 건너뛰지 않고 연속적으로 부여
SELECT name, salary,
	DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM Employees;
name salary dense_ rank
Eve 7000 1
Frank 6500 2
David 6500 2
Bob 5000 3
Charlie 4000 4
Alice 3000 5
  • Frank와 David는 동일한 급여를 받았으므로 2위를 공유
  • 하지만 그 다음 순위는 3위건너뛰지 않고 연속적으로 부여

 

 

요약

  • ROW_NUMBER(): 데이터셋에서 고유한 번호를 매기고 싶을 때 사용합니다. 같은 값에도 개별 순번이 부여
  • RANK(): 동일한 값에 대해 같은 순위를 주고, 그 다음 순위를 건너뛰고 싶을 때 사용
  • DENSE_RANK(): 동일한 값에 대해 같은 순위를 주되, 건너뛰지 않고 연속적인 순위를 부여하고 싶을 때 사용

 

 

 

사용 예시

  • ROW_NUMBER(): 주문 ID 같은 고유한 값을 매기고 싶을 때 사용.
  • RANK(): 마라톤 대회 등에서 1등이 두 명이면 다음 순위가 3등이 되어야 할 때 사용.
  • DENSE_RANK(): 성적 같은 상황에서 1등이 두 명이면 다음 순위가 2등이 되어야 할 때 사용.