안녕하세요 쿼리 질문이 있습니다. 0 4 484

by 렛지 [SQL Query] [2020.02.13 09:46:28]


대용량 데이터( 1100만여건 )에서 중복제거 작업을 하고있습니다.

예를들면 테이블에 A,B,C,D,E,F 컬럼이 있고

A,B,C 컬럼이 중복된 로우가 2개이상인 애들중에 D컬럼이 none인 로우를 지워야합니다.

말은 쉬운데 쿼리로 하려니까 너무 어렵네요 ㅠㅠ

group by나 distinct로 하려니 D컬럼이 안보여서 조건을 어떻게 걸어야 하는건지...

다른 방법으로 찾아보고있는데 도무지 이해가안가네요 ㅠ

자바로 하려니 1100만여건인지라 몇날몇일이 걸릴거같고요...

도와주세요!

by 웅아 [2020.02.13 10:02:23]

partion by로 a,b,c를 주고 rank를 맥입니다. 중복이 안된건 rank = 1로 되겠죠

이것을 WITH 절로 묶은후 조건에 RANK가 2이상인것만 추려 가져옵니다.RANK가 2이상 된것중 D컬럼이 NONE인 것을 지우거나 NOE이 아닌것만 가져오면 됩니다..


by 렛지 [2020.02.13 10:41:56]

답변감사합니다

다시 질문이 있는데요

SELECT A.*,
RANK() OVER (PARTITION BY ETSI_PROJECTS,COMPANIES,APPLICATION_NUMBER,DECLARATIONS,IPR_DISCLOSURES ORDER BY standards desc) as rk     
from(
SELECT '-' AS ETSI_PROJECTS, 'None' as standards, 'andrew' AS COMPANIES, '62194140' AS APPLICATION_NUMBER, 'ISLD-201603-003' AS DECLARATIONS, 'Disclosure number 1' AS IPR_DISCLOSURES FROM DUAL
UNION
SELECT '-', 'None', 'andrew', '62194141', 'ISLD-201603-003','Disclosure number 2' FROM DUAL
UNION
SELECT '-', 'ts101548 v1.3.1', 'andrew', '62194140', 'ISLD-201603-003','Disclosure number 1' FROM DUAL
UNION
SELECT '-', 'ts101548 v1.3.1', 'andrew', '62194141', 'ISLD-201603-003','Disclosure number 2' FROM DUAL
UNION
SELECT 'None', '2.45', 'alcatel', '903.12.0970', 'ISLD-201006-001','Disclosure number 1' FROM DUAL
UNION
SELECT 'None', 'None', 'alcatel', '903.12.0970', 'ISLD-201006-001','Disclosure number 1' FROM DUAL
)A

첫줄에 말씀하신게 이렇게 하는게 맞나요??

다른 값은 다 같으니 order by를 starands에 해야하는데 이러면 standards가 None인게 rk가 1이 될수도있어서요...

아 위에서 말했던 D컬럼이 standards컬럼입니다

 


by 마농 [2020.02.13 10:41:58]
--DELETE    -- 삭제
SELECT *    -- 삭제대상 조회
  FROM t
 WHERE (a, b, c, d) IN (SELECT a, b, c
                             , 'none' d
                          FROM t
                         GROUP BY a, b, c
                        HAVING COUNT(*) > 1
                        )
;

 


by 렛지 [2020.02.13 10:49:56]

감사합니다!

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