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 - 如何通过复合主键过滤表中的记录?的主要内容,如果未能解决你的问题,请参考以下文章

当该列属于Spring中的复合主键时如何按一列过滤

联结表中的复合主键 - Sequelize

仅当复合主键尚不存在时,如何批量插入行? [AWS 红移]

Redshift - 提取约束

从 Redshift 表中获取 JSON 数据

SQL:选择另一个表中没有复合主键的条目