Top N 쿼리
Top N 쿼리는 SQL에서 데이터의 상위 N개를 조회할 때 사용되며, 순위 기반 조회에 자주 활용됩니다. SQL에서 이러한 쿼리를 작성하는 데 사용되는 함수로는 ROWNUM과 윈도우 함수의 순위 함수인 RANK, DENSE_RANK, ROW_NUMBER가 있습니다.
ROWNUM
ROWNUM은 각 행에 고유한 순번을 부여하여, 특정 조건을 만족하는 상위 N개의 데이터를 조회할 때 사용합니다. 단, 오라클에서만 사용 가능한 함수입니다. ROWNUM은 쿼리가 실행되는 순서에 따라 행에 번호를 부여하므로, 일반적인 ORDER BY와 함께 사용할 경우 원하는 대로 동작하지 않을 수 있습니다.
기본 구문:
SELECT column1, column2, ...
FROM table_name
WHERE ROWNUM <= N;
예시: 상위 5명의 직원 조회 (오라클 전용)
SELECT employee_id, name, salary
FROM employees
WHERE ROWNUM <= 5;
주의: ROWNUM은 행 번호가 고정되지 않으므로, ORDER BY와 함께 사용하려면 서브쿼리로 감싸는 것이 좋습니다.
SELECT *
FROM (SELECT employee_id, name, salary FROM employees ORDER BY salary DESC)
WHERE ROWNUM <= 5;
윈도우 함수의 순위 함수
윈도우 함수는 SQL에서 행 간의 계산을 수행하는 함수로, 그룹별 순위를 매기거나 누적합 등을 계산할 때 유용합니다. 윈도우 함수의 순위 함수로는 ROW_NUMBER, RANK, DENSE_RANK가 있으며, 이를 사용하면 각 행에 대해 특정 순위 값을 부여할 수 있습니다.
기본 구문 (윈도우 함수)
SELECT column1, column2, ...,
ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY sort_column DESC) AS row_number,
RANK() OVER (PARTITION BY group_column ORDER BY sort_column DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY group_column ORDER BY sort_column DESC) AS dense_rank
FROM table_name;
ROW_NUMBER()
ROW_NUMBER() 함수는 각 행에 대해 고유한 순번을 부여합니다. 동일한 값을 가진 행이라도 순번은 중복되지 않습니다.
예시: 급여가 높은 상위 5명의 직원 조회
SELECT employee_id, name, salary
FROM (
SELECT employee_id, name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees
) AS ranked
WHERE row_num <= 5;
ROW_NUMBER()를 통해 급여가 높은 순서대로 순번을 매기고, row_num <= 5 조건으로 상위 5명을 조회합니다.
RANK()
RANK() 함수는 동일한 값을 가진 행에 동일한 순위를 부여하지만, 동일 순위 다음 행은 건너뛰고 그다음 순위부터 부여합니다. 즉, 순위에 공백이 생길 수 있습니다.
예시: 각 부서별 급여 상위 3위까지의 직원 조회
SELECT department, employee_id, name, salary
FROM (
SELECT department, employee_id, name, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
) AS ranked
WHERE rank <= 3;
각 부서에서 salary 기준으로 상위 3위까지의 직원 정보를 조회합니다. 동일 급여를 가진 직원들은 같은 순위를 가지며, 다음 순위는 건너뛰게 됩니다.
DENSE_RANK()
DENSE_RANK() 함수는 동일한 값을 가진 행에 동일한 순위를 부여하며, 순위가 연속되게 매겨집니다. 즉, 동일 순위를 가진 다음 행은 바로 다음 순위를 부여받습니다.
예시: 각 부서별 급여 상위 3위까지의 직원 조회
SELECT department, employee_id, name, salary
FROM (
SELECT department, employee_id, name, salary,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank
FROM employees
) AS ranked
WHERE dense_rank <= 3;
department별로 급여가 높은 상위 3위까지의 직원 정보를 조회합니다. 동일한 급여를 가진 직원이 있더라도 순위가 연속되므로 건너뛰는 순위가 없습니다.
각 함수의 차이점 요약
ROWNUM | Oracle 전용, 쿼리 순서대로 행 번호 부여 | 상위 N개 행 조회 |
ROW_NUMBER | 고유 순번 부여, 동일 값이어도 순번 중복 없음 | 그룹별 순위 |
RANK | 동일 순위 부여 후 건너뛰는 순번 생성 | 순위 공백 허용 |
DENSE_RANK | 동일 순위 부여 후 연속된 순번 부여 | 순위 공백 없음 |
이처럼 Top N 쿼리를 작성할 때 ROW_NUMBER, RANK, DENSE_RANK를 활용하면 특정 조건에 따라 원하는 순위를 매겨 필터링할 수 있습니다. 각 함수의 특징을 이해하고 필요에 맞게 사용하여 효율적인 데이터 조회를 할 수 있습니다.
SQL의 Top N 쿼리는 데이터를 정렬하고 필요한 상위 N개의 데이터를 효율적으로 조회할 수 있는 강력한 도구입니다. ROWNUM, ROW_NUMBER, RANK, DENSE_RANK와 같은 순위 함수의 특성과 차이를 이해하면, 다양한 데이터 집합에 대해 유연하고 정확한 분석이 가능합니다.
'프로그래밍 언어 > SQL' 카테고리의 다른 글
[SQL 개념 정리 14] PIVOT절과 UNPIVOT절 (0) | 2024.11.15 |
---|---|
[SQL 개념 정리 13] 계층형 질의와 셀프 조인 (1) | 2024.11.15 |
[SQL 개념 정리 11] 그룹함수 (0) | 2024.11.15 |
[SQL 개념 정리 10] 집합연산자 (0) | 2024.11.15 |
[SQL 개념 정리 9] 서브쿼리 (3) | 2024.11.15 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!