본문 바로가기

SQL

distinct

select distinct field1

from tb_test

 

이렇게 하면 field1에 있는 데이터 중 중복을 제거하고 유니크 한 값들만 나온다.

 

그러나 시간 개념이 들어가서 최신의 데이터에 해당하는 row의 값을 다 가져 오고 싶다면?

distinct에 시간까지 걸면 모든 데이터가 다 유니크 해버린다.

 

oracle db 데이터 중 특정 필드의 중복을 제거하고 최신의 데이터 1개만 가져오기.

숨어 있던 rowid가 이때 도움을 준다.

 

select *

from tb_test

where reg_tm between start_tm and end_tm

     and rowid in (select max(rowid) from tb_test group by field1)

 

중복이 되면 안되는 필드를 group by 해서 rowid를 큰 것 순으로 뽑아내면 된다.

 

 

...라고 썼는데, 생각해보니.. scan 범위를 더 줄일 수 있을 것 같다.

물론 이건 환경과 쓰는 사람 마음에 따라 다르다. 내가 찾은 예제에선 저렇게 되어 있었고..

나는 시간 범위 내에서 중복된 값 중 최신의 것만 찾아내면 되니까.

 

select *

from tb_test

where rowid in (select max(rowid) from tb_test where reg_tm between start_tm and end_tm group by field1)

 

요렇게 작성하면 스캔 범위가 줄어들어 위의 쿼리보단 성능향상에 도움이 될 수 있을 것 같다.

 

 

ps. 스크랩 하시는 분들이 많아져서 추가 사실을 덧붙입니다.

이 구문은 rowid가 숫자일 경우에만 유효합니다.


'SQL' 카테고리의 다른 글

Toad 사용법 1  (0) 2010.09.27
오라클 데이터 타입  (0) 2010.09.24
where 1=1 and A=xxx and B=xx ....여기서 where 1=1 의 의미?!  (0) 2010.07.23
ORACLE 함수정의  (0) 2009.12.21
ORACLE 특정필드값을 우선순위  (0) 2009.12.21