반응형

최근 특정 코드별로 쌓이는 테이블을 일정시간마다 호출해서 마지막값을 가져와야 할 일이 생겼다.

 

여러가지 찾아본 결과는 다음과 같다.

1. order by desc를 통해 select를 해온다.

2. select된 데이터를 한번 더 group by를 한다.

막상 적용해보면 내가 쌓고 있던 테이블의 데이터에서는 group by 후 마지막 날짜의 데이터가 나오지 않았다.

 


아래와 같은 데이터가 있다고 가정하겠다.

예시 데이터

항상 code컬럼의 AAA, BBB, CCC, DDD의 데이터들의 마지막 날짜 데이터들을 가져오는 쿼리를 작성해보겠다.

code컬럼에는 n개가 존재하며 언제나 증가할 수 있다고 가정하고 쿼리를 작성하였다.

 

아래는 조회에 성공한 쿼리이다.

select
	*
from(
	select
		*
	from tb_test
	where (code, date_time) in (
		select code, max(date_time) as date_time
		from tb_test group by code
	)
	order by date_time desc
) t
group by t.code

결과 데이터

 

먼저 뽑아낼 테이블을 max함수를 통해 마지막 날짜 조회 후 group by를 하고 해당하는 데이터를 조건문에 처리(where 조건문 in절부분)하여 최신 데이터 순으로 order by를 통해 다시 한번 정렬을 한다.

 

사실 여기까지만 처리해도 정상적으로 볼 수 있지만, 예시데이터처럼 중복된 시:분:초로 들어온 경우 마지막 한개의 데이터가 보장이 되질 않아 마지막에 group by를 한번 더 처리하였다.

 

아래는 마지막 group by를 안할 경우 발생하는 중복 데이터 노출이다.

시분초가 같은 데이터의 마지막 group by가 없는 경우

 

 

처음에 사실 쉽게 처리가 되질 않아 n개의 code값을 group by하여 가져온 후 그 코드값을 where절에 넣고 select를 n번 요청하였는데, 그 방법보단 위 방법이 깔끔한 것 같다.

반응형