오라클 DB (한테이블에서 중복제거) 문제 안되네요~~~ 0 11 4,691

by 문승록 [기타자료] 중복제거 [2015.06.03 09:27:50]


눈팅만 하다 도저히 모르는 문제가 발생하여 문의 드립니다.

1. A라는 테이블을 검색

2. A라는 테이블에서 B가 중복된것 찾기

3. A라는 테이블에서 중복된 B 중에서 C 가 가장 큰 값을 제외한 나머지

A- 테이블

B-컬럼1

C-컬럼2=값

문제는 두번째 A라는 테이블에서 B가 중복된 것을 카운트까지는 했는데 세번째가 안되네요

 

원래 문제는 A라는 테이블에서 중복된 B 값중에서 C의 값이 가장 큰놈을 빼고 삭제하는 것입니다.

두번째 쿼리

select infraid,cnt,maxrssi from(SELECT infraid, count(*) AS cnt FROM aplist GROUP BY infraid)
where cnt>1

세번재 쿼리 =안됨
select maxrssi from aplist where maxrssi not in max(maxrssi)

by 겸댕2후니 [2015.06.03 09:42:26]

두번째 쿼리

select infraid,cnt,maxrssi from(SELECT infraid, count(*) AS cnt FROM aplist GROUP BY infraid)
where cnt>1

-> 위의 쿼리에서 maxrssi이라는 컬럼은 어디서나온건가요?

 

 

select infraid, col2

from aplist, (SELECT infraid in, max(col2) ma FROM aplist GROUP BY infraid having count(*) > 1) tab 

where aplist.infraid =tab.in and aplist.col2 != tab.ma; 

-> 위의 쿼리형태로수행하면 되지 않을까요?


by 문승록 [2015.06.03 09:51:44]

APLIST 테이블 안에 INFRAID별로 중복된 값 중에서 MAXRSSI 값이 큰것 빼고 찾는 쿼리문입니다.

답변을 활용을 해보았는데 안되는군요..ㅠㅠㅠ


by 겸댕2후니 [2015.06.03 10:18:06]

APLIST 테이블안에 infraid, maxrssi라는 컬럼이 존재하고

infraid컬럼 값 별로 가장 큰 maxrssi값이 존재하는 로우만 제외하고 나머지는 삭제한다고 말씀하시는거죠?


by swlee710 [2015.06.03 09:52:36]

C에 중복이 있는지 모르겠네요..

SELECT *
FROM (
SELECT INFRAID,MAXRSSI
      , ROW_NUMBER() OVER(PARTITION BY INFRAID ORDER BY MAXRSSI  DESC) RN
FROM APLIST
)
WHERE RN > 1;


by 문승록 [2015.06.03 10:06:45]

아  C에 중복이 있습니다.

어쩐지  실행은 되는데 결과값이 전부가 나오진 않는군요....흠....아아아아


by 문승록 [2015.06.03 10:09:22]

랭크함수를 써서 하는법도 있더군요..ㅎㅎ 아 제발  ..되기를....


by 마농 [2015.06.03 10:10:55]
-- 1. 중복 자료 찾기
SELECT b
     , MAX(c)
  FROM a
 GROUP BY b
 HAVING COUNT(*) > 1
;
-- 2. 중복 자료 삭제 대상 찾기
SELECT a.b, a.c
  FROM a
     , (SELECT b
--             , MAX(c)
             , MAX(c) c
          FROM a
         GROUP BY b
         HAVING COUNT()* > 1
        ) b
 WHERE a.b = b.b
   AND a.c < b.c
;
-- 3. 중복 자료 삭제
DELETE FROM a
 WHERE (b, c)
    IN (SELECT a.b, a.c
          FROM a
             , (SELECT b
--                     , MAX(c)
                     , MAX(c) c
                  FROM a
                 GROUP BY b
                 HAVING COUNT()* > 1
                ) b
         WHERE a.b = b.b
           AND a.c < b.c
        )
;
-- 다른 방식. c 가 더 큰게 존재하면 삭제
DELETE FROM a m
 WHERE EXISTS (SELECT 1
                 FROM a
                WHERE b = m.b
                  AND c > m.c
               )

 


by 문승록 [2015.06.03 10:28:01]
SELECT a.b, a.c
  FROM a
     , (SELECT b
             , MAX(c)
          FROM a
         GROUP BY b
         HAVING COUNT()* > 1
        ) b
 WHERE a.b = b.b
   AND a.c < b.c
두번째 쿼리문에서 맨 마지막 AND부분에서 오류가 나는데요...
그 위에까지는 중복된 값을 찾아라까지는 되었습니다. 그런데 여기서 중복된 값중에서 큰값을 제외한 나머지를 구하는 겁니다. 그런면 지금 이 쿼리문에서 서브쿼리를 써야하는건가요?

by 겸댕2후니 [2015.06.03 10:33:13]
SELECT a.b, a.c
  FROM a
     , (SELECT b
             , MAX(c)
          FROM a
         GROUP BY b
         HAVING COUNT()* > 1
        ) b
 WHERE a.b = b.b
   AND a.c < b.c
 
위의 이 쿼리 자체가 큰값을 제외한 나머지를 구하는겁니다.

by 문승록 [2015.06.03 10:40:16]

아...뻘짓 하고 있었네요~~~ㅠㅠㅠ

 


by 마농 [2015.06.03 10:55:52]

MAX(c) 에 알리아스를 안줘서 그렇군요.

MAX(c) AS c

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