【问题标题】:How to delete duplicate records based on two unique columns in RedShift [duplicate]如何根据 RedShift 中的两个唯一列删除重复记录 [重复]
【发布时间】:2021-11-11 04:04:47
【问题描述】:

我有下表红移。

guest_id name rownum
1 Safvan 1
1 Safvan 2
1 Thomas 3
2 Anandu 1
2 Manish 2

我需要根据guest_id删除每个分区中的所有记录,除了max(rownum)的记录。

结果应该是这样的

guest_id name rownum
1 Thomas 3
2 Manish 2

提前感谢您提供宝贵的帮助。

【问题讨论】:

  • 请展示您当前的尝试并描述其中的问题。
  • 在某处帮助了我..这是一个很好的线程。我已经发布了我的解决方案作为答案。

标签: sql duplicates amazon-redshift


【解决方案1】:

子查询返回 guest_id 明智的最大行,然后加入主表,其中匹配的 guest_id 和 max_row 不等于 row_num 然后执行 DELETE。

DELETE redshift
FROM redshift r
INNER JOIN (SELECT guest_id
                 , MAX(rownum) rownum
           FROM redshift
           GROUP BY guest_id) t
        ON r.guest_id = t.guest_id
       AND r.rownum != t.rownum

请从https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=47081e3517000949460932808ac9f09d查看

使用 CTE 删除重复记录

WITH t_cte AS (
       SELECT *
            , ROW_NUMBER() OVER (PARTITION BY guest_id ORDER BY rownum DESC) row_num
       FROM redshift
)
DELETE redshift 
FROM t_cte c
INNER JOIN redshift r
        ON c.guest_id = r.guest_id
       AND  c.row_num > 1 AND c.rownum = r.rownum

请查看网址https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=90b7099ca779c0836b90278ae1b3635a

【讨论】:

  • 这里与cte一起使用时,delete会撞到原表redshift?或者您错过了将原始表放在主查询中?
  • WITH cte AS ( SELECT * , ROW_NUMBER() OVER (PARTITION BY guest_id ORDER BY rownum DESC) row_num FROM redshift ) DELETE FROM redshift rs inner join cte on rs.rownum=cte.row_num WHERE cte.row_num<>1;这是正确的查询?
  • 请从您可以检查数据的给定网址检查。
  • Redshift 基本上是建立在 Postgres 之上的,在 Postgres 中查询抛出错误。
  • 你可以使用第一个查询。
【解决方案2】:

我的解决办法是:

create table table_rownum as (
select
    *,
    row_number() over (partition by guest_id
order by
    rownum desc) as rownum_temp
from
    table_orig);

delete from table_rownum where rownum_temp<>1;

alter table table_rownum drop column rownum_temp;

truncate table table_orig;

insert into table_orig (select * from table_rownum);

drop table table_rownum;

如果有更好的解决方案,请提出建议。

【讨论】:

  • 使用 CTE 删除重复记录。请检查我的答案。无需创建额外的表,也无需执行删除或截断。仅 DELETE 用于删除。
【解决方案3】:

从没有rownum的表名中删除(select max(rownum) from table name groupby column)

【讨论】:

  • 如果子查询返回多行,则删除表中的所有数据。
  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-11-11
  • 2021-09-22
  • 1970-01-01
  • 2021-02-09
  • 2017-07-06
  • 2019-03-28
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多