2016-07-07 2 views
2

500GB의 사본과 파티션이있는 거대한 테이블이 있고 거의 20 억 개의 레코드가 있습니다.행 ID를 사용하여 고유 한 행을 내 보냅니다.

3 개의 열 값이 일치하면 해당 레코드를 선택하는 조건을 작성하려고합니다 (예를 들어 4 개의 중복 레코드가 있음). 그리고 최소/최대 행 ID로 레코드 하나를 내보내십시오.

삭제 나 새 테이블 xyz를 만드는 것과 같은 다른 방법이있을 수 있습니다. 그러나 우리는 수출에 질의 옵션을 사용하여 접근하기로 결정했습니다. 아무도 올바른 구문을 얻을 수 있다면 나를 도와주세요.

내가 함께 시도하고있다 :

query= schema.table:"WHERE ROWID <> 
(SELECT MAX(ROWID) FROM schema.table A WHERE A.col1 = A.col1 AND A.col2 = A.col2 AND A.col3 = A.col3)" 

하지만이 아마 중복 걸릴 것입니다, 난 그냥 함께 노력 = 및 < = 기호와 저를 도움이되지 이잖아. 그 어떤 행을 수출하지, 0rows 수출 말합니다 그래서 어떤 제안?

답변

1

사용하여 dublicate 열

select a,b,c, count(*), min(rowid), max(rowid) 
    from your_table 
group by a,b,c 
having count(*) > 1 

이 필요한 경우

select * 
    from your_table 
where rowid in (
    select min(rowid)--, max(rowid) 
     from your_table 
    group by a,b,c 
    having count(*) > 1 
) 

죄송합니다, 모든 행 inlude UNIQ 같은 다음 U 필요한 선택 할 수있는 행과 어떤 dublicate 행의 1을 갖는 그룹, 필요가 없음

select * 
     from your_table 
    where rowid in (
     select min(rowid)--, max(rowid) 
      from your_table 
     group by a,b,c 
    ) 
+2

주의 : 고유 한 행은 복사하지 않지만 중복 된 행은 내 보내지 않습니다. –

+0

나는 대답을 수정한다, thx, 나는 단지 dubles –

1

NOT EXIST 연산자를 사용하여 ta에서 하나의 레코드 만 선택할 수 있습니다 가장 높은 ROWID와 BLE :

SELECT * 
FROM table A 
WHERE NOT EXISTS (
    SELECT 1 FROM table B 
    WHERE A.col1 = B.col1 AND A.col2 = B.col2 AND A.col3 = B.col3 
    AND A.ROWID < B.ROWID 
) 
2

각 그룹의 최소를 얻기 위해 analytic function를 사용; 이는 단일 테이블 스캔 만 필요합니다 (즉 상관 된 하위 쿼리 없음).

SELECT a,b,c -- ,d,e,f,g ... 
FROM (
    SELECT t.*, 
     ROWID AS rid, 
     MIN(ROWID) OVER (PARTITION BY a, b, c) AS min_rid 
    FROM schema_name.table_name t 
) 
WHERE rid = min_rid; 
0

덕분에 모든 일이 ... 정말 있습니다 .. 하위 분할 레벨에 .. 내가 비슷한 logics..dnt 기억 그러나 확실하게하려고합니다 시도했다 추측 .. 빠른 반응을 평가하고 확인

하지만, 당신의 guyies가 지정한 각 질문에 대한 빠른 질문은 쿼리 블록의 내보내기 매개 변수에서 해결할 수 있습니까?