조건에 맞는 중복 데이터 중 최신을 가져오고 싶습니다. 0 2 1,327

by Lucky postgresql 조건 중복 [2016.10.27 22:12:23]


안녕하세요. 

 

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;

 

아무래도 제가 뭔가 착각하고 있는 부분이 있는듯 합니다...

도움 부탁드립니다. _ _);;

 

 

by Dev03 [2016.10.28 09:26:00]
select *
from tb_test
where (create_time||name1||name2) in
(select max(create_time||name1||name2) from tb_test group by substring(tca from 1 for 16), name1, name2)
order by process_time;

 


by Lucky [2016.10.28 11:04:03]

정말 감사합니다! 원하던 결과를 얻을 수 있었습니다...

질문에서 substring(process_time from 1 for 16) 부분을 substring(tca from 1 for 16) 라고 잘못 적었었습니다..

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입