我正在编写一个脚本,用于删除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;
答案 0 :(得分:0)
仅采用sale_id, sale_date
的独特价值
create table table_name_new as select distinct sale_id, sale_date
from main.sales;
答案 1 :(得分:0)
我对您的问题以及其余各栏的内容感到困惑。但是,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
);