簡體   English   中英

刪除 ID 在 Redshift 中多次存在的行

[英]Delete rows where ID exists more than once in Redshift

我正在玩 Redshift 進行練習。 我每天都將數據加載到 Redshift 表中,並嘗試在每次攝取后刪除重復項。 我最初嘗試了以下方法來創建一個包含不同記錄的新表,然后刪除舊表。

CREATE TABLE reddit_new AS SELECT DISTINCT * FROM reddit;
ALTER TABLE reddit RENAME TO reddit_old;
ALTER TABLE reddit_new RENAME TO reddit;
DROP TABLE reddit_old;

然而我后來意識到,雖然有些行具有相同的 ID,但有些列總是不同的。

因此,我需要刪除 ID 重復的行,而不是刪除重復的行。 理想情況下,我想保留最近日期的記錄。 如果他們有相同的日期,則只需刪除其中一個或。 所以在下面的示例中,它只會刪除第 2 行。

ID      Date
34      2022-02-01
23      2022-03-05
12      2022-03-06
23      2022-03-18

我還考慮過更新我的 COPY 命令以僅添加表中不存在 ID 的記錄,但不確定這是否可能。 這是我當前的 COPY 命令,它每天運行,從 S3 中的一個新文件復制:

f"COPY public.Reddit FROM '{s3_file}' iam_role '{role_string}' IGNOREHEADER 1 DELIMITER ',' CSV"

解決這個問題的一個常見模式是不直接復制到您的表中,而是首先復制到一個(可能是臨時的)暫存位置,然后使用該表中的數據從主表中刪除。

CREATE TABLE staging LIKE "Reddit";
COPY staging FROM '<s3_file>' iam_role '<role>' ignoreheader 1 delimiter ',' csv;
DELETE FROM public."Reddit"
USING staging
WHERE 
  public."Reddit"."ID" = staging."ID"
  AND public."Reddit"."Date" <= staging."Date";
ALTER TABLE public."Reddit" append FROM staging;
DROP TABLE if EXISTS staging;

在這里我沒有使用臨時表,以便alter append可以工作,但您可以使用從臨時表insert into

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM