Redshift Upsert,其中staging具有重复项

时间:2018-06-01 13:15:18

标签: sql amazon-redshift

我有一个存储帖子的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 :(得分:1)

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;

您需要列出要插入的列。

答案 1 :(得分:0)

问题在于您的以下查询,distinct *可能会返回重复项。

INSERT INTO posts SELECT DISTINCT * FROM posts_staging;

你应该在upsert之前先从post_staging中删除重复项。