Redshift Upsert, где постановка имеет дубликаты - PullRequest
0 голосов
/ 01 июня 2018

У меня есть база данных Redshift, в которой хранятся сообщения.Посты определяются как уникальные по их post_id, а все остальные поля могут быть переменными.

Я использую промежуточную таблицу, чтобы сделать эквивалент UPSERT, используя следующий запрос:

BEGIN;
CREATE TABLE posts_staging (LIKE posts);
COPY posts_staging (post_id,user_id,timestamp,votes,comments) FROM 's3://posts' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=yyyy' CSV;
DELETE FROM posts USING posts_staging WHERE posts.post_id = posts_staging.post_id;
INSERT INTO posts SELECT DISTINCT * FROM posts_staging;
DROP TABLE posts_staging;
END;

В большинстве случаев это работает правильно, однако я замечаю некоторые повторяющиеся значения в таблице.Я полагаю, что происходит то, что есть вероятность, что загруженный файл CSV будет иметь дубликат post_ids, но с другими полями (например, с разным количеством лайков), то есть DISTINCT вставляет несколько одинаковых post_id,Есть ли способ изменить этот запрос только на INSERT уникальный post_ids?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Redshift, увы не поддерживает distinct on.Но вы можете использовать row_number():

INSERT INTO posts
    SELECT . . .
    FROM (SELECT ps.*, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY post_id) as seqnum
          FROM posts_staging ps
         ) ps
    WHERE seqnum = 1;

. Вам нужно будет перечислить вставляемые столбцы.

0 голосов
/ 01 июня 2018

Проблема с вашим следующим запросом, отличный * может возвращать дубликаты.

INSERT INTO posts SELECT DISTINCT * FROM posts_staging;

Перед удалением необходимо удалить дубликаты из post_staging.

...