2016-07-07 55 views
2

我有一個巨大的表,重複500 GB和分區,有近20億條記錄。使用行ID導出唯一行

我打算寫一個條件,如果3列值匹配,然後選擇這些記錄,(說我們有4個重複的記錄)。並採用最小/最大行號記錄導出其中一條記錄。

我知道可能有不同的方法,如刪除或創建新的表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

使用具有和GROUP BY您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的和行什麼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,我想什麼只談論一些事情 –

1

您可以使用NOT EXIST運算符從ta中只選取一條記錄最高ROWID竹葉提取:

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記住,但會嘗試肯定..在子分區級別,並檢查..

但我對每一個你的傢伙指定的快速問題,這將解決出口參數在查詢塊嗎?