我有一个存储帖子的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
?
答案 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中删除重复项。