【发布时间】:2019-04-10 09:32:24
【问题描述】:
我正在编写一个脚本来删除 RedShift 表中的重复项。但是由于该表有一个包含 2 列的复合主键,因此我在选择和过滤值时遇到了问题。
这是我到目前为止所实施的。如果我只有一列作为 PK 会很容易,但是如何为复合键 (sale_id, sale_date) 实现相同的结果?
第二步尤其成问题 - 将具有 WHERE 条件的不同行复制到新表中。
第 1 步
-- Saving PKs with dupes into a TEMP TABLE
CREATE TEMP TABLE main.duplicate_sales AS
SELECT sale_id, sale_date
FROM main.sales
WHERE sale_date=2019-05-20
GROUP BY 1,2
HAVING COUNT(*) > 1;
第 2 步
-- Copy distinct rows for the above PKs to a new table
CREATE TEMP TABLE main.sales_new(LIKE main.sales);
INSERT INTO main.sales_new
SELECT DISTINCT *
FROM main.sales
WHERE sale_id, sale_date IN(
SELECT sale_id, sale_date
FROM main.duplicate_sales
);
UPD: 表格很大,所以我想避免选择所有记录。将不同记录复制到新表中后(第 2 步),我从原始表中删除重复的行(第 3 步),然后从新表中插入不同的记录(第 4 步)。
第 3 步
-- Delete all rows that contain duplicates
DELETE FROM main.sales
WHERE sale_id, sale_date IN(
SELECT sale_id, sale_date
FROM main.duplicate_sales
);
第 4 步
-- Insert back distinct records
INSERT INTO main.sales
SELECT *
FROM main.sales_new;
【问题讨论】:
-
能否分享您的示例数据
-
我很困惑。如果两列是主键,那么它们是唯一的。你是说你有两列想要是唯一的,但不是?
-
@GordonLinoff RedShift 中的 PK 不保证没有重复记录。我只需要清理历史数据
标签: sql amazon-redshift