【问题标题】:Delete duplicate rows in Oracle SQL, leaving the latest entries删除 Oracle SQL 中的重复行,保留最新条目
【发布时间】:2020-07-05 06:03:53
【问题描述】:

我正在使用以下 SQL 来识别表“transaction_list”中的重复项。这完美地工作。现在我想根据这些条件从该表中删除所有重复项,只保留最新条目。这些可以由列“last_update”标识。我尝试了不同的 DELETE 语句,但没有奏效。任何建议都受到高度赞赏。

SELECT par_num
,tran_num
,COUNT(*) AS num_duplicates
FROM transaction_list
WHERE last_update >= to_date('01-mar-2020 00:00:00', 'dd-mon-yyyy 
hh24:mi:ss')
GROUP BY par_num
,tran_num
HAVING COUNT(*) > 1
ORDER BY par_num

【问题讨论】:

  • 3 月 1 日在您的示例代码中有什么意义?您是特别想要那个日期和时间,还是只是想在决定删除哪个 par_num / tran_num 重复项时将 last_update 用作决胜局?

标签: sql oracle duplicates sql-delete


【解决方案1】:

这是一种使用行 ID 的方法:

delete from transaction
where 
    last_update = date '2020-03-01'
    and rowid in (
        select rid
        from (
            select 
                rowid rid, 
                row_number() over(partition by par_num ,tran_num order by last_update desc) rn
            from transaction                
        ) t
        where rn > 1
    )

子查询为其组中不是最新的行生成行 ID 列表(即具有相同par_num ,tran_num 的所有记录) - 每个组的最新记录使用row_number() 标识。外部查询只是删除这些行。

【讨论】:

  • 谢谢,但它会抛出错误:ORA-00904: "RN": invalid identifier
  • @Skywalker:对不起,我忘了给row_number() 一个别名。固定。
【解决方案2】:

如果想法是删除所有par_num / tran_num 重复项,除了每个集合中由last_update 排序的最后一个,那么应该这样做:

delete transaction_list
where  rowid in
       ( select lag(rowid)
                over (partition by par_num, tran_num order by last_update)
         from   transaction_list );

DBFiddle

解释:lag 从上一行(或另一个更早的行 - 如果需要,您可以指定各种偏移逻辑,但这里我们只想要上一行)返回一个值。 over() 子句指定排序和窗口。在这种情况下,我们希望按last_update 对每组par_num / tran_num 组合进行排序并删除前一行。 partition by 部分表示每个 par_num / tran_num 组合的排序重置,因此每个组都有一个不会被删除的“最后”行。

【讨论】:

  • 谢谢。非常有帮助。您能解释一下滞后(rowid)和按工作划分的方式吗?我不熟悉他们。
  • 添加说明。
  • 谢谢,伙计,非常感谢!非常简洁明了。只是为了完全理解,ORDER BY 的目的是什么,这里只是可选的吗?
  • lag 函数需要排序,以便知道哪一行是前一行。 (再次查看我的答案,我意识到我将par_numtran_num 留在了不需要它们的order by 子句中。希望没有它们会更清楚。)
  • 非常感谢,威廉!希望这里的所有人都像你一样解释:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多