반응형
RANK, DENSE_RANK, 그리고 ROW_NUMBER는 SQL 쿼리에서 윈도우 함수(Window Function)로 사용되는 함수들로, 특히 순위와 관련된 작업에 활용됩니다. 이 세 함수는 유사해 보일 수 있지만, 각각 다른 순위 계산 방식을 가지며 다양한 상황에서 사용됩니다.
- RANK() 함수:
- 동일한 값에 대해 같은 순위를 부여하고 다음 순위는 건너뛰는 방식입니다.
- 예를 들어, 1등과 2등이 있을 경우 다음 순위는 3이 아니라 3등이 됩니다.
- 순위가 동일한 경우 동일한 순위를 부여하고, 그 다음 순위는 건너뜁니다.
- DENSE_RANK() 함수:
- 동일한 값에 대해 같은 순위를 부여하지만, 다음 순위는 건너뛰지 않습니다.
- 예를 들어, 1등과 2등이 있을 경우 다음 순위는 3이 됩니다.
- 순위가 동일한 경우에도 순차적으로 순위가 증가합니다.
- ROW_NUMBER() 함수:
- 각 행마다 고유한 순위를 부여합니다.
- 중복되는 값이 있더라도 각 행의 순위는 중복되지 않습니다.
이러한 함수들의 차이점을 요약하면 다음과 같습니다:
- RANK(): 동일한 순위일 경우 다음 순위를 건너뛰는 방식.
- DENSE_RANK(): 동일한 순위일 경우 다음 순위도 증가하는 방식.
- ROW_NUMBER(): 각 행마다 고유한 순위를 부여하는 방식.
어떤 함수를 사용할지는 문제의 상황과 요구사항에 따라 결정됩니다.
먼저, 예제를 위한 가상의 데이터를 생성하겠습니다. 예제에서는 학생들의 점수를 이용하여 순위를 계산해보겠습니다.
이름 | 점수 |
Alice | 85 |
Bob | 75 |
Carol | 90 |
David | 85 |
Eve | 75 |
이제 RANK(), DENSE_RANK(), ROW_NUMBER() 함수를 사용하여 이 데이터의 순위를 계산해보겠습니다.
SELECT 이름, 점수,
RANK() OVER (ORDER BY 점수 DESC) AS RANK,
DENSE_RANK() OVER (ORDER BY 점수 DESC) AS DENSE_RANK,
ROW_NUMBER() OVER (ORDER BY 점수 DESC) AS ROW_NUMBER
FROM 학생들;
위 쿼리를 실행한 결과는 다음과 같습니다:
이름점수RANKDENSE_RANKROW_NUMBER
이름 | 점수 | RANK | DENSE-RANK | ROW_NUMBER |
Carol | 90 | 1 | 1 | 1 |
Alice | 85 | 2 | 2 | 2 |
David | 85 | 2 | 2 | 3 |
Bob | 75 | 4 | 3 | 4 |
Eve | 75 | 4 | 3 | 5 |
여기서 확인할 수 있는 내용:
- RANK(): Carol(90)이 1등, Alice(85)과 David(85)가 2등, Bob(75)과 Eve(75)가 4등.
- DENSE_RANK(): Carol(90)이 1등, Alice(85)과 David(85)가 2등, Bob(75)과 Eve(75)가 3등.
- ROW_NUMBER(): 각 행마다 고유한 순위 부여. Carol(90)은 1, Alice(85)은 2, David(85)은 3, Bob(75)는 4, Eve(75)는 5.
이런 식으로 RANK(), DENSE_RANK(), ROW_NUMBER() 함수는 다양한 순위 계산 방식을 제공하며, 각각의 상황에 맞게 활용할 수 있습니다.
반응형