【问题标题】:RedShift - How to filter records in a table by a composite Primary Key?RedShift - 如何通过复合主键过滤表中的记录?
【发布时间】: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


【解决方案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
                     );
    

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2020-03-17
      相关资源
      最近更新 更多