오라클 distinct 질문입니다 0 16 14,779

by 모델장윤주 distinct [2012.11.29 17:07:36]


distinct 문제입니다.

distinct를 사용할줄만 알았지 어떻게 돌아가는지는 몰랐는데 3시간정도 삽푼 결과 
select절에서 distinct가 컬럼을 반환하는게 아니라 행을 반환하는 거였더라구요..

select distinct test1 이렇게 했을 경우에 중복제거된 test1 내용이 나오지만
select distinct test1, test2 이렇게 했을 경우에 둘 다 중복된 데이터가 나와서 쿼리하는 부분에 문제가 생겼습니다.

test2의 값은 현재 시간으로 넘어가는 값이라 값이 전부 다릅니다. 그래서 test1의 값이 같아도 test2의 값이 항상 다르기 때문에
distinct 추가 결과 다른 값으로 인식해서 넘어갑니다.

이부분을 서브쿼리 절을 써봐도 해결하는데 문제가 있어서 질문드립니다.

테이블을 고쳐야하나요? 아니면... 쿼리로 어떻게 해결할 수 있을까요 ???

by 사랑초 [2012.11.29 17:25:19]
원하시는 결과값에 대해 올리신 질문내용만으로는 잘 이해가 안되네요...
제가 실력이 부족한 탓일수도...
TEST1 필드를 개별로 중복제거하고
TEST2 필드를 개별로 중복제거하고 두개의 필드를 합쳐서 보여주시고 싶으시단걸로 추측은 되는데....

by 모델장윤주 [2012.11.29 17:38:43]
 사랑초님 답변 감사합니다

제가 질문을 난해하게 적었나보네요 ㅠ

필드1      필드2            필드3
AAA         88           2012-11-15 오후 3:30:22
BBB         88           2012-11-13 오후 1:10:22
AAA         88           2012-11-17 오후 23:30:22
CCC         88           2012-11-15 오후 13:30:22
AAA         55           2012-11-16 오후 5:30:12

이렇게 있다고 가정했을 경우에

필드2가 88인 값중에
AAA, BBB, AAA, CCC 이면
필드3의 최근 날짜값으로 AAA의 데이터를 중복 제거 해서 가져오고 싶습니다.

최종 데이타 목록은

AAA         88           2012-11-17 오후 23:30:22
CCC         88           2012-11-15 오후 13:30:22
BBB         88           2012-11-13 오후 1:10:22

이런형식으로 나오도록요, 정렬값을 날짜에 맞춰주고싶습니다.

by 마농 [2012.11.29 17:39:02]

원하시는게 중복제거는 아닌듯 하고.. 엑셀의 셀병합 같은 걸 원하시는 거라면?
그런 기능은 없구요.
유사하게 첫행만 자료를 보여주고 두번째 행은 자료를 안보여 주는 방법을 구현할 수는 있습니다.
SELECT NULLIF(test1, LAG(test1) OVER(ORDER BY test1, test2)) test1, test2
SELECT DECODE(ROW_NUMBER() OVER(ORDER BY test1, test2), 1, test1) test1, test2


by 마농 [2012.11.29 17:42:13]
-- Group By 에 대한 질문이었네요
-- 중복제거가 아니라 "집계"라는 표현이 맞겟네요
SELECT 필드1, 필드2, MAX(필드3) 필드3
  FROM 테이블
 GROUP BY 필드1, 필드2
;

by 신이만든짝퉁 [2012.11.29 17:50:22]
SELECT *
  FROM
      (
      SELECT field1, field2, field3, row_number() over(partition BY field1 ORDER BY field3 desc) AS rn
        FROM tablename
       WHERE field2 = 88
      )
 WHERE rn = 1
 ORDER BY filed3 desc
;

요걸 원하시는 건가요?

by 모델장윤주 [2012.11.29 17:50:53]
마농님 답변 감사합니다

마농님이 주신 조언에 따라 쿼리를 해봤는데
필드1의 값이 중복제거가 되지 않네요


select test1, max(test3) as test3
   from eps_searches
   where test2 = '88'
   group by test1, test3
   order by test3 desc; 

이렇게 쿼리문을 돌렸는데

test1의값은 중복제거가 되지 않고 나옵니다.
groupby에 test1, test2, test3의 조건을 다 주고 돌려도봤습니다

답변 감사합니다^^

by 모델장윤주 [2012.11.29 17:53:10]
짝퉁님 답변 감사합니다

조언해주신 쿼리대로 셀렉트하니 원하는 결과값을 가져왔네요

감사합니다 ㅠㅠ

row_number() 저 부분은 개인적으로 알아서 공부해봐야겠네요 ㅠ 답변 감사합니다!!!

by 신이만든짝퉁 [2012.11.29 17:53:31]
요렇게 하라는 말씀이신 것 같은데요?

select test1, max(test3) as test3
   from eps_searches
   where test2 = '88'
   group by test1
   order by test3 desc;

by 신이만든짝퉁 [2012.11.29 17:55:28]
 select test1, test2, max(test3) as test3
   from eps_searches
   where test2 = '88'
   group by test1, test2
   order by test3 desc;

요렇게요~

by 모델장윤주 [2012.11.29 17:55:45]
아? group by로 묶어도 나오네요
필드1, 필드2 같이 묶어논걸로 보고
제가 쿼리를 저렇게 짯었네요.

필드값 하나로 묶어서 보여주니 되네요

짝퉁님 답변 감사합니다!!

by 신이만든짝퉁 [2012.11.29 17:56:51]
인사는 마농님께 돌립니다.  ^^;

by 마농 [2012.11.29 17:56:51]
group by test1, test3 가 아니라
group by test1, test2 입니다.

by 마농 [2012.11.29 17:57:55]

자꾸 중복 제거라는 용어로 접근하시니 서로가 헷갈리네요...
중복제거가 아닙니다. 그룹별 집계가 맞는 용어입니다.


by 모델장윤주 [2012.11.29 18:09:33]
마농님 , 짝퉁님 답변 감사합니다

부족함을 뭔가 지식으로 채워가는 느낌이네요.
햇갈리지 않도록 한번 더 복습하겠습니다.

아. (그럼 중복제거는 어떨 때 쓰는 말인가요? 중복된 데이터를 삭제할때 쓰는 말인가요??)

답변 감사합니다^^

by 마농 [2012.11.29 18:17:15]
-- 1. 중복제거 - Distinct
-- 여러행의 중복된 자료를 중복을 제거하여 1행으로 보여 주는 거구요.
SELECT DISTINCT test1, test2 FROM test;

-- 2. 그룹별 집계 - Group By
-- 그룹별로 묶어서 집계하여 보여주는것
-- 그룹별로 묶는것 까지는 Distinct 와 동일함
-- 여기에 집계함수를 이용해 다양한 정보를 수집할 수 있습니다.
SELECT test1, test2
     , COUNT(*)
     , SUM(test3) 
     , MIN(test3) 
     , MAX(test3) 
     , AVG(test3) 
  FROM test
 GROUP BY test1, test2
;

by 모델장윤주 [2012.11.29 18:25:21]
마농님 간단한 질문에도 세세한 답변 감사드립니다

엄청 알차고 좋은 정보를 얻어가는거 같아요

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