반응형
순위함수 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
반응형
'프로그래밍 > MSSQL 정리필요' 카테고리의 다른 글
[DB_MSSQL] 프로시저/테이블/컬럼 조회 (INFORMATION_SCHEMA) (0) | 2017.02.09 |
---|---|
[DB_MSSQL] 테이블명/컬럼명 변경 (SP_RENAME) (0) | 2017.02.09 |
[DB_MSSQL] @@IDENTITY (자동증가값) IDX 반환 (0) | 2017.02.08 |
[DB_MSSQL] HTML 태그 제거 함수 (0) | 2017.02.07 |
[DB_MSSQL] 특수문자 포함여부를 체크하는 함수 구현 (0) | 2017.02.07 |