본문 바로가기
프로그래밍/SQL, Hive, SAS 관련 정보

[SQL - Frequently Used Code] Min/Max 집계 함수의 활용

by 물박사의 저장공간 2025. 4. 8.

2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents


이건 어쩌면 굉장히 당연하고 기초적인 내용이긴 한데 (놀랍게도!) 제가 종종 혼동을 일으키는 부분이라서 역시 정리해보도록 하겠습니다. 

MIN/MAX.. 등의 집계함수는 Group by나 Window함수 처럼 "집계"를 할 수 있는 녀석들과 같이 사용해야 합니다. 

 

예를 들어 아래와 같은 데이터가 있다고 해봅시다. 

Sales 테이블

 

여기서 제가 원하는 것은 A칼럼의 최대값 200을 찾고 이 값으로 A칼럼의 값들을 normalization 한 값이라고 해봅시다. 그런데, 제가 자주 범하는 실수가.. 아래와 같은 쿼리를 작성하는 것 입니다. 

SELECT tdate, A / MAX(A) AS normalize_A, B
FROM table;

 

SQL 표준에 따르면 모든 컬럼이 집계 함수에 포함되어야 하는데, 그렇지 않으면 오류가 발생합니다. MySQL의 경우 ONLY_FULL_GROUP_BY 옵션이 비활성화되어 있다면 비표준 동작으로 임의의 값이 선택될 수 있으나, 의도한 결과(원래 행 수를 유지하면서 각 행마다 전체 A의 최대값으로 계산된 새로운 컬럼 추가)를 얻을 수 없습니다.

 

만약 의도한 바를 구하는 올바른 쿼리를 쓴다면 (물론 다른 방법도 있겠죠?)

SELECT 
  tdate,
  A / (SELECT MAX(A) FROM table) AS normalize_A,
  B
FROM table;

 

과 같이 쓸 수 있습니다.