SQL의 순위 관련 함수들
안녕하세요! 오늘은 SQL에서 데이터를 순위별로 나눌 때 자주 사용하는 함수들에 대해 알아보려고 해요.
데이터 분석이나 보고서를 작성할 때 순위 매기기가 얼마나 중요한지 잘 아시죠?
그렇다면, 다양한 순위 관련 함수들을 알아보고 그 사용 예시를 살펴봅시다!
1. ROW_NUMBER()
ROW_NUMBER()
함수는 각 행에 고유한 순번을 매겨줍니다. 예를 들어, 직원들의 목록을 정리할 때 각 직원에게 번호를 매길 수 있겠죠?
예제 코드
SELECT
employee_name,
ROW_NUMBER() OVER (ORDER BY hire_date) AS row_num
FROM
employees;
예제 테이블
employee_name | hire_date |
John | 2022-01-10 |
Alice | 2022-01-15 |
Bob | 2022-01-12 |
출력 결과
employee_name | hire_date | row_num |
John | 2022-01-10 | 1 |
Bob | 2022-01-12 | 2 |
Alice | 2022-01-15 | 3 |
위 예시에서는 직원들을 입사 날짜 순으로 정렬하고, row_num
이라는 열에 순번을 매깁니다. 첫 번째로 입사한 직원은 1번, 두 번째는 2번... 이런 식으로요!
2. RANK()
RANK()
함수는 동일한 값이 있을 때 동일한 순위를 부여합니다. 다만, 다음 순위는 건너뛰게 돼요.
예를 들어, 점수가 같은 학생들에게 동일한 순위를 매길 때 유용하죠.
예제 코드
SELECT
student_name,
RANK() OVER (ORDER BY score DESC) AS rank
FROM
students;
예제 테이블
student_name | score |
John | 90 |
Alice | 95 |
Bob | 90 |
출력 결과
student_name | score | rank |
Alice | 95 | 1 |
John | 90 | 2 |
Bob | 90 | 2 |
여기서, 점수가 높은 순서대로 학생들에게 순위를 매깁니다. 만약 1등이 2명 있다면, 그 다음 순위는 3등이 됩니다.
3. DENSE_RANK()
DENSE_RANK()
함수도 동일한 값에는 동일한 순위를 부여하지만, 다음 순위는 건너뛰지 않습니다. 이를 통해 연속된 순위를 매길 수 있어요.
예제 코드
SELECT
student_name,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM
students;
출력 결과
student_name | score | dense_rank |
Alice | 95 | 1 |
John | 90 | 2 |
Bob | 90 | 2 |
이 예시에서는 RANK()
와 비슷하지만, 1등이 2명일 경우 다음 순위는 3등이 아닌 2등이 됩니다.
4. NTILE(n)
NTILE(n)
함수는 결과 집합을 n개의 그룹으로 나누고, 각 그룹에 순위를 매깁니다. 예를 들어, 상위 25%, 50%, 75%, 100%로 나누고 싶을 때 유용해요.
예제 코드
SELECT
product_name,
NTILE(4) OVER (ORDER BY sales DESC) AS quartile
FROM
products;
예제 테이블
product_name | sales |
Product A | 500 |
Product B | 300 |
Product C | 700 |
Product D | 200 |
출력 결과
product_name | sales | quartile |
Product C | 700 | 1 |
Product A | 500 | 2 |
Product B | 300 | 3 |
Product D | 200 | 4 |
여기서는 판매량을 기준으로 제품을 4개의 그룹으로 나누고, 각 그룹에 순위를 부여합니다. 이로써 가장 많이 팔린 제품부터 순서대로 1, 2, 3, 4로 나뉘게 됩니다.
5. PERCENT_RANK()
PERCENT_RANK()
함수는 각 행의 상대적인 순위를 0과 1 사이의 백분율로 나타냅니다. 첫 번째 행은 항상 0의 값을 갖고, 마지막 행은 1에 가까운 값을 가집니다.
예제 코드
SELECT
employee_name,
salary,
PERCENT_RANK() OVER (ORDER BY salary) AS percent_rank
FROM
employees;
예제 테이블
employee_name | salary |
John | 4000 |
Alice | 5000 |
Bob | 3000 |
출력 결과
employee_name | salary | percent_rank |
Bob | 3000 | 0.0 |
John | 4000 | 0.5 |
Alice | 5000 | 1.0 |
이 예시에서는 직원들의 급여를 기준으로 백분율 순위를 계산합니다. 예를 들어, 가장 낮은 급여를 받는 직원은 0에 가까운 값을, 가장 높은 급여를 받는 직원은 1에 가까운 값을 가지게 되죠.
6. CUME_DIST()
CUME_DIST()
함수는 특정 값 이하의 값이 전체에서 차지하는 누적 비율을 계산합니다. 전체 데이터에서 특정 값 이하의 데이터가 얼마나 차지하는지를 나타낼 때 유용합니다.
예제 코드
SELECT
product_name,
sales,
CUME_DIST() OVER (ORDER BY sales DESC) AS cumulative_distribution
FROM
products;
예제 테이블
product_name | sales |
Product A | 500 |
Product B | 300 |
Product C | 700 |
Product D | 200 |
출력 결과
product_name | sales | cumulative_distribution |
Product C | 700 | 1.0 |
Product A | 500 | 0.75 |
Product B | 300 | 0.5 |
Product D | 200 | 0.25 |
이 예시에서는 판매량을 기준으로 누적 분포를 계산합니다. 가장 많이 팔린 제품부터 가장 적게 팔린 제품까지의 누적 비율을 알 수 있습니다.
7. RATIO_TO_REPORT
RATIO_TO_REPORT
는 Oracle SQL에서 제공되는 분석 함수로, 특정 그룹 내에서 각 행의 값을 해당 그룹 전체 합계 대비 백분율로 계산할 때 사용됩니다.
이 함수는 특히 데이터가 여러 범주나 그룹으로 나뉘어 있을 때, 각 항목이 그룹 내에서 얼마나 큰 비중을 차지하는지 분석할 때 유용합니다.
예제 코드
아래는 sales_data라는 테이블에서 제품별 매출 비중을 계산하는 예제입니다:
SELECT product_name, sales,
RATIO_TO_REPORT(sales) OVER () AS sales_ratio
FROM sales_data;
예제 테이블
product_name | sales |
Product A | 500 |
Product B | 300 |
Product C | 700 |
Product D | 200 |
출력 결과
위 쿼리를 실행하면 각 제품이 전체 매출에서 차지하는 비중을 백분율로 나타낸 결과를 얻을 수 있습니다.
product_name | sales | sales_ratio |
Product A | 500 | 0.2941 |
Product B | 300 | 0.1765 |
Product C | 700 | 0.4118 |
Product D | 200 | 0.1176 |
마무리하며...
이렇게 SQL에서 순위와 관련된 다양한 함수들을 살펴보았습니다.
이 함수들을 활용해서 직접 작성해보셔야 본인만의 개념이 적립될 것입니다!
궁금한 점이 있으면 언제든지 댓글로 남겨주세요. 😊
'데이터베이스_Database > SQL' 카테고리의 다른 글
[SQL] 쉬워지는 JOIN 2편 - SELF JOIN (0) | 2024.08.06 |
---|---|
[SQL] 쉬워지는 JOIN 1편 - INNER, OUTER, CROSS (0) | 2024.08.06 |
[SQL] 함수 종속성 규칙 (0) | 2024.08.02 |
[SQL] 그룹함수(ROLLUP, CUBE, GROUPING SET) 예시를 통해 완전 습득하기! (0) | 2024.08.02 |
[SQL] 제약 조건 조회/삭제하기 ! (0) | 2024.04.14 |