【问题标题】:SQL:Remove duplicate Records ,If Date Difference between duplicate records is less than 30 daysSQL:删除重复记录,如果重复记录之间的日期差异小于 30 天
【发布时间】:2015-10-04 06:41:29
【问题描述】:

如果两个重复记录之间的CreatedDate(another column) 差异小于 30 天,我想从表中删除重复记录(在 fkInvoiceIdfkcontractid 的基础上重复)。

WITH cte AS 
(   
    SELECT 
        Id,
        fkcontractid,
        fkInvoiceId,
        CreatedDate, 
        row_number() OVER(PARTITION BY fkcontractid, fkInvoiceId ORDER BY fkcontractid) AS [rn]   
    from mytable left join Invoice on Invoice.pkinvoiceid = mytable.fkinvoiceid
)   
delete tt from mytable tt inner join CTE as x on x.Id = tt.Id 
WHERE x.[rn] > 1;

上面的查询正在删除重复的记录(fkInvoiceIdfkcontractid),但它没有考虑到 Date(createdDate) 的差异。

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 假设您有 3 个副本,每个副本相隔 28 天。应该删除哪些,为什么?
  • 如果我有三个重复的,那么我想保留最新的一个。其余的记录应该删除。

标签: sql common-table-expression duplicate-removal


【解决方案1】:

你可以试试这个吗?

delete tt from mytable tt inner join CTE as x on x.Id = tt.Id 
WHERE x.[rn] > 1 and datediff(day,tt.date_col,x.date_col)<30;

【讨论】:

  • 感谢您的回答,但对我来说没有帮助。它仍在删除所有重复记录。不考虑日期因素。
【解决方案2】:

不知道每列来自哪些表1,发布您需要的确切查询有点棘手,但按照这些思路应该可以工作:

DELETE FROM t1
FROM mytable t1
    INNER JOIN
mytable t2
    ON
        t1.fkcontractid = t2.fkcontractid and
        t1.fkInvoiceId = t2.fkInvoiceId and
        t1.ID != t2.ID and --Assuming this is the primary key
        t1.CreatedDate < t2.CreatedDate and
        DATEADD(day,30,t1.CreatedDate) >= t2.CreatedDate

希望逻辑足够清晰,可以阅读 - 对于每一行,我们尝试找到具有相同 fkcontractidfkInvoiceId 的另一行(IDs 不匹配),这发生在当前行之后但最多只能延迟 30 天。

如果我们成功地进行了连接,那么应该删除这一行(来自t1)。


1如果 Invoice 是定义此查询的重要组成部分,我不清楚为什么在您的尝试中它被 LEFT JOINed 而不是 INNER

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 2013-10-28
    • 2017-07-06
    • 2010-10-24
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多