RedShift-如何通过复合主键过滤表中的记录?

时间:2019-04-10 09:32:25

标签: sql amazon-redshift

我正在编写一个脚本,用于删除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;

2 个答案:

答案 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
                 );