2016-07-07 2 views
2

У меня есть огромная таблица с дубликатами 500 ГБ и с разделами, имеют почти 2 миллиарда записей.экспорт уникальных строк с использованием строки 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

использование, с и группой ваших Продублируйте колонны

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 и 1 из ряда какого продублируйте, не требуется

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

Внимание, это не будет экспортировать уникальные строки, но те, у которых есть дубликаты. –

+0

i'am изменить ответ, thx, я думаю, что говорят только о разрезах –

1

Оператор NOT EXIST может использовать только одну запись от та BLE с самым высоким 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 помнит, но будет стараться, конечно .. на уровне и проверить подраздел ..

но мой быстрый вопрос к каждому, что вы указали гантели, будет ли это работать в параметре экспорта в блоке запроса?

Смежные вопросы