본문 바로가기

프로그래밍/MSSQL 정리필요

[DB_MSSQL] ROW_NUMBER, RANK, DENSE_RANK 순위함수

반응형

순위함수 ROW_NUMBER, RANK, DENSE_RANK에 대해 알아보자



1. ROW_NUMBER


다음과 같은 데이터를 가지고 있는 테이블A가 있다.


WITH TABLE_A (ID, Score) AS (
    SELECT 'A', 80 UNION ALL
    SELECT 'B', 90 UNION ALL
    SELECT 'C', 60 UNION ALL
    SELECT 'D', 100
)
SELECT * FROM TABLE_A


이 데이터를 Score 점수를 기준으로 해당 ID의 등수를 매겨보려고 한다.


ROW_NUMBER() OVER() 를 이용하여 쿼리를 다음과 같이 작성해보자 (DESC : 내림차순, ASC : 오름차순)


SELECT *, ROW_NUMBER() OVER(ORDER BY Score DESC) AS 'Row'
FROM TABLE_A

결과는 다음과 같다.






2. 그 외 순위함수



1. ROW_NUMBER()

중복 순위를 무시한다.

즉, 동일한 값이 있을 경우 동일한 순위가 아닌 순차적으로 순위를 매긴다.

따라서 같은 순위가 존재하지 않게 된다.



2. RANK()

중복 순위 적용 후 다음 순위에 변동이 있다.

동일한 값이 있을 경우 동일한 순위를 준다.

그 다음 순위는 바로 다음 순위가 아닌, 중복 순위 적용 후의 순위다 된다.


▶ 2등이 2명일 경우

2명 모두 2등이고, 그 다음 등수는 3등이 아니라 4등이 된다.



3. DENSE_RANK()

중복 순위 적용 후 다음 순위에 변동을 주지 않는다.

RANK와 마찬가지로 동일한 값은 같은 순위가 된다.

하지만, 그 다음 순위는 +1된 무조건 다음 순위가 된다.


▶ 2등이 2명일 경우

2명 모두 2등이고, 그 다음 등수는 3등이다.




  요약



WITH TABLE_A (NAME, Score) AS (
    SELECT '지현', 80 UNION ALL
    SELECT '민지', 80 UNION ALL
    SELECT '수지', 60 UNION ALL
    SELECT '경희', 100
)
SELECT *
    , ROW_NUMBER() OVER(ORDER BY Score DESC) AS 'Row'
    , RANK() OVER(ORDER BY Score DESC) AS 'Rank'
    , DENSE_RANK() OVER(ORDER BY Score DESC) AS 'Dense_Rank'
FROM TABLE_A





반응형