2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
이건 어쩌면 굉장히 당연하고 기초적인 내용이긴 한데 (놀랍게도!) 제가 종종 혼동을 일으키는 부분이라서 역시 정리해보도록 하겠습니다.
MIN/MAX.. 등의 집계함수는 Group by나 Window함수 처럼 "집계"를 할 수 있는 녀석들과 같이 사용해야 합니다.
예를 들어 아래와 같은 데이터가 있다고 해봅시다.
여기서 제가 원하는 것은 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;
과 같이 쓸 수 있습니다.
'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글
[SQL문제풀이-Groupby/Subquery] Movie Rating (0) | 2025.04.13 |
---|---|
[SQL문제풀이-Union활용] Count Salary Categories (0) | 2025.04.09 |
[SQL 기초] order 기준 열의 Null (0) | 2025.04.08 |
[SQL - Frequently Used Code] partition by / order by 없이 window함수 쓰기 (0) | 2025.04.07 |
[SQL문제풀이 - Having 절 조건주기] - Customers Who Bought All Products (0) | 2025.04.07 |