RedShift - 如何通过复合主键过滤表中的记录?
Posted
技术标签:
【中文标题】RedShift - 如何通过复合主键过滤表中的记录?【英文标题】:RedShift - How to filter records in a table by a composite Primary Key? 【发布时间】: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 不保证没有重复记录。我只需要清理历史数据 【参考方案1】:只取 sale_id, sale_date
的不同值怎么样
create table table_name_new as select distinct sale_id, sale_date
from main.sales;
【讨论】:
【参考方案2】:我对您的问题以及其余列的情况感到困惑。但是,EXISTS
可能足以替换您当前的第二步:
INSERT INTO main.sales_new
SELECT DISTINCT s.*
FROM main.sales s
WHERE EXISTS (SELECT 1
FROM main.duplicate_sales ds
WHERE ds.sale_id = s.sale_id AND
ds.sale_date = s.sale_date
);
【讨论】:
以上是关于RedShift - 如何通过复合主键过滤表中的记录?的主要内容,如果未能解决你的问题,请参考以下文章