안녕하세요.
DB : Postgresql, 테이블명 TB_Test
cid create_time process_time name1 name2 cost
1 2016-10-01 10:00:00 2016-10-10 10:00:00 AAA BBB 500
2 2016-10-01 10:10:00 2016-10-10 10:00:30 AAA BBB 400
3 2016-10-01 10:20:00 2016-10-10 10:01:00 AAA BBB 450
4 2016-10-02 00:00:00 2016-10-15 20:00:00 CCC DDD 500
5 2016-10-02 00:01:00 2016-10-15 20:00:30 AAA BBB 300
6 2016-10-03 00:00:00 2016-10-15 20:00:50 CCC DDD 700
7 2016-10-03 00:10:00 2016-10-15 20:00:30 CCC DDD 900
위와 같은 테이블에서 아래와 같은 결과를 얻고자 합니다.
cid create_time process_time name1 name2 cost
2 2016-10-01 10:10:00 2016-10-10 10:00:30 AAA BBB 400
3 2016-10-01 10:20:00 2016-10-10 10:01:00 AAA BBB 450
5 2016-10-02 00:01:00 2016-10-15 20:00:30 AAA BBB 300
7 2016-10-03 00:10:00 2016-10-15 20:00:30 CCC DDD 900
규칙은 process_time 에서 초를 제외하고 분 까지 같고 name1과 name2가 같은 항목 중
process_time이 가장 최근의 값의 열을 가져오는 것입니다.
process_time의 값이 초 까지 같을 경우는 create_time이 가장 최근의 값의 열을 가져옵니다.
process_time의 값이 같아도 name1과 name2의 값이 다르다면 다른 항목입니다.
process_time 순서와 cid 순서는 서로 연관이 없습니다. cid 번호가 높아도 더 과거의 시간이 나올 수 있습니다.
대략 2만개 이상의 항목을 작업을 하고 있는데
이 문제를 해결해 보려 아래와 같이 해서 작성해본 결과
중복된 값도 나오고 원하는 값이 나오지 않아 이곳까지 오게 되었습니다..
select *
from tb_test
where create_time in
(select max(create_time) from tb_test group by substring(process_time from 1 for 16), name1, name2)
order by process_time;
아무래도 제가 뭔가 착각하고 있는 부분이 있는듯 합니다...
도움 부탁드립니다. _ _);;