【问题标题】:How to update older "duplicate" records (duplicate except for the date column)如何更新旧的“重复”记录(除了日期列之外的重复)
【发布时间】:2015-08-29 03:41:35
【问题描述】:

在此示例中,我们有一个表格,其中包含指向每个订阅者的人口统计问题 (questionID) 的链接,日期表明订阅者何时回答了特定人口统计问题。在某些情况下,订阅者可能在以后再次回答了同一个问题,而我们现在有多个记录用于相同的订阅者和 questionID,但回答日期不同(请参阅示例数据):

subscriberID questionID  dateAnswered            isDeleted
------------ ----------- ----------------------- ---------
100          559         2015-07-29 13:07:26.153 0
100          560         2015-07-29 13:07:26.153 0
100          561         2015-07-29 13:07:26.153 0
100          562         2015-07-29 13:07:26.153 0
100          575         2015-07-29 13:07:26.153 0
102          559         2015-07-30 15:12:46.143 0
102          564         2015-07-30 15:12:46.143 0
102          588         2015-07-30 15:12:46.143 0
102          559         2015-07-31 16:11:53.323 0
114          575         2015-08-21 11:27:14.253 0
114          588         2015-08-21 11:27:14.253 0
114          560         2015-08-21 11:27:14.253 0
114          588         2015-08-24 05:44:42.030 0
114          562         2015-08-21 11:27:14.253 0
114          575         2015-08-24 05:44:42.030 0

存储答案的应用本应将旧记录标记为“已删除”(设置 isDeleted = 1),但它没有这样做,我现在需要清理旧记录。

这似乎应该很简单,但它让我难住了。我如何 (a) 选择任何有重复的订阅者 ID 和问题 ID 但回答日期不同的记录?以及 (b) 我如何进行更新以将每个订阅者的除最新记录之外的所有记录设置为 isDeleted=1?

任何帮助将不胜感激!我怀疑自我加入可能是为了,但我还没有弄清楚。因此问题!

【问题讨论】:

    标签: sql-server tsql duplicate-data


    【解决方案1】:
    ;WITH X AS 
     ( 
      SELECT ROW_NUMBER() OVER (PARTITION BY 
                                subscriberID, questionID  
                                ORDER BY dateAnswered DESC) rn 
      , * 
      FROM TableName 
     )
    UPDATE X 
     SET isDeleted = 1
    WHERE rn > 1
    

    【讨论】:

    • 完美。非常感谢。我应该知道...但现在我知道了! :)
    • 嗯.. 这个场景有点扭曲。在某些情况下,可能有多个记录具有相同的subscriberID、questionID 和dateAnswered...例如,如果问题允许选择多个答案,那么如果用户进行了三个选择,则可能有3 个记录具有完全相同的dateAnswered。在这种情况下,如果它们都是最新的 dateAnswered,则应保留所有三个记录(不标记为删除)。如果有第二组答案(1 个或多个)日期较早,则应删除这些答案。这改变了一些事情......不过我会看看我能不能解决它。
    【解决方案2】:

    下面的选择/更新将影响所有未标记为已删除的记录,每个订阅者对每个问题的最后一条记录除外。只是另一种方法。

       WITH LastAnswers AS
        (
        SELECT    subscriberID ,questionID , MAX(dateAnswered) AS LastAnsweredDate
        FROM      TableName 
        GROUP BY  subscriberID ,questionID
        )
    
    UPDATE TableName
       SET TableName.isDeleted = 1
    FROM 
      TableName
    
    LEFT JOIN LastAnswers 
    ON  TableName.subscriberID = LastAnswers.subscriberID 
    AND TableName.questionID   = LastAnswers.questionID 
    AND TableName.dateAnswered = LastAnswers.LastAnsweredDate
    
    WHERE  LastAnswers.LastAnsweredDate IS NULL AND TableName.isDeleted = 0
    

    【讨论】:

    • 谢谢理查德,这与我在上面评论中提到的问题完美配合。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2020-04-12
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多