DENSE_RANK() OVER (ORDER BY COUNT())
는 되는데
MAX(COUNT())는 안되는 이유
2025.01.03 - [Oracle/공부] - [SQL] FROM 서브쿼리 별칭을 WHERE 서브쿼리에서 참조할 수 없는 이유
[SQL] FROM 서브쿼리 별칭을 WHERE 서브쿼리에서 참조할 수 없는 이유
프로그래머스에서 제공하는 SQL 코딩테스트 문제를 풀다가 오류가 발생했다.리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 문제였는데 아래가 오류가 난 쿼리이다. SELECT MEMBER_NAME, REVIEW_TE
maango97.tistory.com
저번 글에서 FROM 절의 서브쿼리 별칭을 WHERE 절의 서브쿼리에서 쓸 수 없는 이유에 대해 다뤘다.
같은 쿼리를 작성하다가 DENSE_RANK() OVER (ORDER BY COUNT())는 되는데 MAX(COUNT())는 안되는 이유가 궁금해졌다.
1. MAX와 DENSE_RANK 개념
<MAX: 집계 함수 (Aggregate Function)>
- MAX의 역할:
- 다중 행 함수로 여러 행을 바탕으로 하나의 값을 반환
- 열(column)의 값 중 가장 큰 값을 반환
- 예시:
SELECT MAX(salary) AS max_salary FROM employees;
-> 테이블에서 가장 높은 급여를 반환
<DENSE_RANK: 윈도우 함수 (Window Function)>
- DENSE_RANK의 역할:
- 순위를 매기는 함수로, 특정 기준에 따라 데이터의 각 행에 순위를 부여
- RANK 함수와 다른 점은 순위는 중복값이 있더라도 연속적으로 증가(1, 2, 2, 2, 3처럼 순위 사이에 공백이 없음)
- 예시:
SELECT employee_id, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
→ 급여가 높은 순서대로 순위가 매겨진다.
2. 집계 함수와 윈도우 함수 차이점
| 집계 함수 | 윈도우 함수 | |
| 출력 결과 | 1개의 요약된 결과 | 각 행에 대해 계산된 결과 |
| 사용 목적 | 데이터 요약(합계, 평균, 최소/최대값 등) | 순위 매기기, 누적 계산, 이전/다음 값 참조 등 |
| OVER() 절 필요 | X | O |
| 주요 함수 | MAX, MIN, COUNT, SUM, AVG, | DENSE_RANK, RANK, NTILE, LAG, LEAD |
3. DENSE_RANK() OVER (ORDER BY COUNT())는 되는데 MAX(COUNT())는 안되는 이유?
DENSE_RANK()는 윈도우 함수고 COUNT(*)는 집계 함수여서 서로 다른 역할을 수행하기 때문이다.
COUNT()로 그룹화된 값을 기준으로 각 행에 순위를 추가로 계산하는 것이므로 문제없이 실행된다.
반면, MAX와 COUNT는 둘 다 집계 함수이기 때문에 둘 다 데이터를 요약하는 기능하므로 같은 쿼리에서 사용할 수 없다(요약을 한 뒤 또 요약을 하려는 작업이므로 실행 불가하다. SQL 엔진은 한 번에 두 단계의 요약 작업을 허용하지 않는다).
따라서 MAX와 COUNT를 동시에 사용하려면 쿼리를 분리해서 사용해야 한다.
4.정리
- DENSE_RANK()는 데이터를 요약하지 않고, 기존 데이터 행을 유지하면서 추가적인 결과를 계산하므로 실행 가능
- MAX와 COUNT는 둘 다 데이터를 요약하려 하기 때문에, 단일 쿼리에서 실행 불가
'Oracle > 공부' 카테고리의 다른 글
| [SQL] SQL의 실행 과정과 옵티마이저(Optimizer) (0) | 2025.01.11 |
|---|---|
| [SQL] LEVEL을 이용해서 구구단 1단부터 9단까지 출력하기 (0) | 2025.01.07 |
| [SQL] FROM 서브쿼리 별칭을 WHERE 서브쿼리에서 참조할 수 없는 이유 (2) | 2025.01.03 |
| [SQL] 다중 행 서브쿼리에서 ANY & ALL 연산자 사용 (1) | 2025.01.02 |
| [SQL] EXISTS와 IN은 어떻게 다를까? (0) | 2025.01.01 |