반응형
Notice
Recent Posts
Recent Comments
Link
개발은 처음이라 개발새발
[MySQL] RANK() / DENSE_RANK() / ROW_NUMBER() 본문
반응형
-- ROW_NUMBER() : 중복 없는 순위 (고유)
-- RANK() : 동점일 때 중복 순위(공동 등수)
-- + 공동 순위자가 있을 때 그 수만큼
-- 건너뛰고 다음 등수를 매김
-- DENSE_RANK() : 동점일 때 중복 순위(공동 등수)
-- + 순위를 연속으로 매김
SQL상에서 순위를 매기는 방법은 ROW_NUMBER() / RANK() / DENSE_RANK() 세가지가 있다. 이 함수들을 사용할 때 함께 붙어오는 것이 있는데 OVER()이다. OVER() 안에는 ORDER BY를 통해 조회시 표출 되는 조건을 붙일 수 있고 PARTITION BY를 통해 순위를 구분하는 또 하나의 조건을 설정할 수 있다.
WITH TB AS (
SELECT 'A' AS NAME, 'class1' AS class, 100 AS score
UNION ALL SELECT 'B' AS NAME, 'class1' AS class, 90 AS score
UNION ALL SELECT 'C' AS NAME, 'class1' AS class, 95 AS score
UNION ALL SELECT 'D' AS NAME, 'class1' AS class, 95 AS score
UNION ALL SELECT 'E' AS NAME, 'class1' AS class, 80 AS score
UNION ALL SELECT 'F' AS NAME, 'class2' AS class, 100 AS score
UNION ALL SELECT 'G' AS NAME, 'class2' AS class, 90 AS score
UNION ALL SELECT 'H' AS NAME, 'class2' AS class, 80 AS score
UNION ALL SELECT 'I' AS NAME, 'class2' AS class, 70 AS score
UNION ALL SELECT 'J' AS NAME, 'class2' AS class, 80 AS score
)
SELECT
*,
ROW_NUMBER() OVER(ORDER BY score DESC) AS col_rownum,
RANK() OVER(ORDER BY score DESC) AS col_rank,
DENSE_RANK() OVER(ORDER BY score DESC) AS col_denserank
FROM TB
위에처럼 class 구분 없이 전체로 순위를 매겨봤다 그렇다면 class1, class2별 학급 석차는 어떻게 매겨야할까? 이때 PARTITION BY를 통해 추가 구분 조건을 넣어 학급별 석차 결과를 도출할 수 있다.
/* PARTITION BY 적용 */
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY class ORDER BY score DESC) AS col_rownum,
RANK() OVER(PARTITION BY class ORDER BY score DESC) AS col_rank,
DENSE_RANK() OVER(PARTITION BY class ORDER BY score DESC) AS col_denserank
FROM TB
ORDER BY class
반응형
'mysql' 카테고리의 다른 글
[MySQL] MySQL Installer를 활용해 버전 다운그레이드 하기 (0) | 2024.02.20 |
---|---|
[MySQL] MySQL Installer를 활용해 버전 관리하기 (0) | 2024.02.20 |
[MySQL] SQL에서 REPLACE()함수 (0) | 2024.02.11 |
[MySQL] SQL에서 EXCEPT() (0) | 2024.02.11 |
[MySQL] 날짜에서 원하는 정보만 추출 DATE_TRUNC() / DATETIME_TRUNC() / TIMESTAMP_TRUNC() (0) | 2024.02.10 |