Oracle/공부

[SQL] MAX(COUNT())가 실행되지 않는 이유(집계함수, 윈도우함수)

maango97 2025. 1. 5. 13:00
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는 둘 다 데이터를 요약하려 하기 때문에, 단일 쿼리에서 실행 불가