Как удалить дубликаты записей в таблице базы данных снежинок - PullRequest
0 голосов
/ 06 октября 2019

как удалить дубликаты записей из таблицы снежинок. Спасибо

ID Name
1  Apple
1  Apple
2  Apple
3  Orange
3  Orange

Результат должен быть:

ID Name
1  Apple
2  Apple
3  Orange

Ответы [ 3 ]

2 голосов
/ 06 октября 2019

Если у вас есть какой-то первичный ключ как таковой:

CREATE TABLE fruit (key number, id number, name text);

insert into fruit values (1,1, 'Apple'), (2,1,'Apple'),
      (3,2, 'Apple'), (4,3, 'Orange'), (5,3, 'Orange');

как тогда

DELETE FROM fruit
WHERE key in (
  SELECT key 
  FROM (
      SELECT key
          ,ROW_NUMBER() OVER (PARTITION BY id, name ORDER BY key) AS rn
      FROM fruit
  )
  WHERE rn > 1
);

Но если у вас нет уникального ключа, вы не сможете удалить этот путь. В этот момент

CREATE TABLE new_table_name AS
SELECT id, name FROM (
    SELECT id
        ,name
        ,ROW_NUMBER() OVER (PARTITION BY id, name) AS rn
    FROM table_name
)
WHERE rn > 1

, а затем своп их

ALTER TABLE table_name SWAP WITH new_table_name
1 голос
/ 07 октября 2019

Снежинка не имеет эффективных первичных ключей, их использование в основном с инструментами ERD. В Snowflake также нет ничего похожего на ROWID, поэтому нет способа идентифицировать дубликаты для удаления.

Возможно временно добавить столбец "is_duplicate", например. нумерация всех дубликатов с помощью функции ROW_NUMBER (), а затем удаление всех записей с помощью «is_duplicate»> 1 и, наконец, удаление служебного столбца.

Другой способ - создать дублирующуюся таблицу и поменять местами, как предлагали другие,Тем не менее, ограничения и гранты должны быть сохранены. Один из способов сделать это:

CREATE TABLE new_table LIKE old_table COPY GRANTS;
INSERT INTO new_table SELECT DISTINCT * FROM old_table;
ALTER TABLE old_table SWAP WITH new_table;

Приведенный выше код удаляет точные дубликаты. Если вы хотите получить строку для каждого «PK», вам нужно включить логику, чтобы выбрать копию, которую вы хотите сохранить.

Это иллюстрирует важность добавления столбцов меток времени обновления в хранилище данных Snowflake.

0 голосов
/ 08 ноября 2019

Ваш вопрос сводится к: Как я могу удалить одну из двух совершенно одинаковых строк? . Ты не можешьВы можете сделать только DELETE FROM fruit where ID = 1 and Name = 'Apple';, тогда оба ряда уйдут. Или нет, и сохраните оба.

Для некоторых баз данных есть обходные пути, использующие внутренние строки, но в снежинке их нет, см. https://support.snowflake.net/s/question/0D50Z00008FQyGqSAL/is-there-an-internalmetadata-unique-rowid-in-snowflake-that-i-can-reference. Вы также не можете ограничить удаление, поэтому ваш единственный вариант - создать новую таблицу и поменяться местами.


Дополнительное примечание к замечанию Ганса Хенрика Эриксена о важности отметок времени обновления: это реальная помощь, когдадубликаты были добавлены позже. Если, например, вы хотите сохранить новые значения, вы можете сделать это:

-- setup
create table fruit (ID Integer, Name VARCHAR(16777216), "UPDATED_AT" TIMESTAMP_NTZ);
insert into fruit values (1, 'Apple', CURRENT_TIMESTAMP::timestamp_ntz)
, (2, 'Apple', CURRENT_TIMESTAMP::timestamp_ntz)
, (3, 'Orange', CURRENT_TIMESTAMP::timestamp_ntz);
-- wait > 1 nanosecond
insert into fruit values (1, 'Apple', CURRENT_TIMESTAMP::timestamp_ntz)
, (3, 'Orange', CURRENT_TIMESTAMP::timestamp_ntz);

-- delete older duplicates (DESC)
DELETE FROM fruit
  WHERE (ID
  , UPDATED_AT) IN (
     SELECT ID
     , UPDATED_AT
     FROM (
         SELECT ID
         , UPDATED_AT
         , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY UPDATED_AT DESC) AS rn
         FROM fruit
     )
     WHERE rn > 1
  );
...