반응형
GROUP BY는 집계 함수의 결과를 특정 칼럼 기준으로 묶어 출력해주는 쿼리인데 GROUP BY를 하게 되면 특정 칼럼과 집계 함수 외에 다른 컬럼은 조회할 수가 없다.
PostgreSQL같은 경우는 다른 칼럼을 조회하려고 하면 아래와 같은 에러가 발생한다.
SQL Error [42803]: 오류: column "test.id" 는 반드시 GROUP BY 절내에 있어야 하던지 또는 집계 함수 내에서 사용되어져야 한다
MySQL은 GROUP BY의 칼럼 외에도 조회가 가능하지만 정확한 데이터가 아니다. 그리고 특정 데이터베이스에 구애받지 않아야 한다.
name 칼럼을 group by 하여 마지막 날짜의 value를 가져오는 쿼리를 작성하고자 했다.
데이터는 아래와 같다.
name별 value의 합계는 간단하게 구할 수 있다.
select NAME, SUM(VALUE) from TEST group by NAME order by NAME;
결과
name별 가장 최신 일자도 간단하게 구할 수 있다.
select NAME, max(CREATE_TIME) from TEST group by NAME order by NAME;
결과
하지만 name별 value의 합계가 아닌, name별 최신 일자가 아닌 name별 마지막으로 생성된 value를 구해야 했다.
먼저 name별 가장 최신 일자를 추출하고, 해당 name과 일자를 조건으로 줘서 원하는 결과를 얻었다.
select NAME, VALUE, CREATE_TIME
from TEST
where (NAME, CREATE_TIME)
in (
select NAME, max(CREATE_TIME) as CREATE_TIME
from TEST
group by NAME
)
order by NAME;
결과
※WHERE 절의 IN 사용법
WHERE 칼럼 IN (조건1, 조건2, 조건3)
: WHERE 뒤의 칼럼들과 IN 뒤의 조건들이 일치하는 ROW를 가져오게 된다. 나열한 조건들은 OR 조건으로 조회된다.
WHERE NAME = 'A'
OR NAME = 'B'
WHERE NAME IN ('A','B')
두개의 결과가 같다
반대로 WHERE 칼럼 NOT IN (조건1, 조건2, ...) 는 일치하지 않는 데이터를 조회할 수 있다.
But 이 경우 같은 시간이 존재한다면 문제가 생긴다...
name과 create_time이 동일한 데이터가 존재한다면 위 쿼리를 실행했을 때 아래와 같은 결과가 나온다
728x90
반응형
'개발 > DB' 카테고리의 다른 글
[MySQL] Authentication plugin 'caching_sha2_password' cannot be loaded (0) | 2022.05.20 |
---|---|
[DB] UUID를 PK(Primary Key)로 사용하는 이유? (0) | 2022.01.17 |
댓글