Невозможно удалить повторяющиеся данные из таблицы Netezza

Я пытаюсь удалить дубликаты записей из таблицы netezza. Но немногие столбцы содержат нулевое значение, поэтому приведенный ниже код не работает.

DELETE FROM TABLE_NAME a
     WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
                               FROM TABLE_NAME b
                              WHERE a.COL1  = b.COL1
                                AND a.COL2  = b.COL2
                                AND a.COL3  = b.COL3);

Sample Data:-
COL1  COL2  COL3
X     NULL     Y
A     NULL     B
X     NULL     Y
X     NULL     Y
E     VAL      F

Expected result:
    COL1  COL2  COL3
    X     NULL     Y
    A     NULL     B
    E     VAL      F

Примечание. Столбец COL2 содержит нулевое значение. Всего в этой таблице 30 столбцов, а 6 столбцов содержат нулевое значение для повторяющихся записей.

Может кто-нибудь, пожалуйста, помогите мне в этом вопросе.

4 ответа

Вы можете использовать функцию NVL для перевода значений NULL в то, что вы можете сравнить. * Редактировать: вы отметили, что NVL не работает. Кроме того, вы можете переписать запрос, чтобы явно обработать NULL:

Например:

DELETE FROM TABLE_NAME a
     WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
                               FROM TABLE_NAME b
                              WHERE((a.COL1 = b.COL1) or (a.COL1 is null and b.COL1 is null))
                                AND ((a.COL2 = b.COL2) or (a.COL2 is null and b.COL2 is null))
                                AND ((a.COL3 = b.COL3) or (a.COL3 is null and b.COL3 is null));
DELETE FROM TABLE_NAME a
     WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
                               FROM TABLE_NAME b
                              WHERE nvl(a.COL1,0)  = nvl(b.COL1,0)
                                AND nvl(a.COL2,0)  = nvl(b.COL2,0)
                               and nvl(a.COL3,0)  = nvl(b.COL3,0));

Замените нулевое значение на 0, используя функцию NVL

Попробуйте использовать оператор /=/ вместо =. Обычно в таких ситуациях у меня работает

Для контекста, каковы столбцы распределения для таблицы, сколько строк в вашей таблице и какой процент из них вы ожидаете дублировать? В зависимости от масштаба подход CTAS может быть более подходящим, чем УДАЛЕНИЕ.

Тем не менее, вот подход, который дает правильную логику удаления, но, возможно, не лучший исполнитель.

TESTDB.ADMIN(ADMIN)=> select * from table_name;
 COL1 | COL2 | COL3 
------+------+------
 X    |      | Y
 X    |      | Y
 E    | VAL  | F
 A    |      | B
 X    |      | Y
(5 rows)

delete 
from 
        table_name
where   rowid in 
        ( select 
                rowid 
        from 
                ( select 
                        rowid, 
                        row_number() over (
                                   partition by col1, 
                                           col2     , 
                                           col3 
                                   order by 
                                           col1) rn
                from 
                        table_name
                ) foo
        where   rn > 1
        ) ;

DELETE 2
TESTDB.ADMIN(ADMIN)=> select * from table_name;
 COL1 | COL2 | COL3 
------+------+------
 A    |      | B
 X    |      | Y
 E    | VAL  | F
(3 rows)
Другие вопросы по тегам