Sql server 如何更新旧的“重复”记录(除日期列外重复)

Sql server 如何更新旧的“重复”记录(除日期列外重复),sql-server,tsql,duplicate-data,Sql Server,Tsql,Duplicate Data,例如,我们有一个表,其中包含每个订阅者的人口统计问题questionID的链接,其中的日期指示订阅者回答特定人口统计问题的时间。在某些情况下,订阅者可能在以后的某个日期再次回答了相同的问题,并且我们现在有多个记录用于相同的订阅者和问题ID,但具有不同的回答日期,请参见示例数据: subscriberID questionID dateAnswered isDeleted ------------ ----------- ----------------------- --

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

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,但它没有这样做,我现在需要清理旧记录

这看起来应该很简单,但这让我很困惑。如果有重复的subscriberID和QuestionID,但回答日期不同,我如何选择任何记录?b我如何进行更新以设置每个订阅服务器的所有记录(除了最新记录外)isDeleted=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
   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

完美的多谢。我应该知道。。。但现在我知道了隐马尔可夫模型。。这个场景有一个小小的转折。在某些情况下,可能有多个记录具有相同的subscriberID、questionID和DateResponsed。。。例如,如果问题允许选择多个答案,则如果用户选择了三个答案,则可能有三条记录的回答日期完全相同。在这种情况下,如果这三条记录都是最新的DateResponsed,则不应将其标记为删除。如果第二组答案中有1个或更多的日期较旧,则应删除这些答案。这稍微改变了一些事情。。。不过,我会看看我是否能解决这个问题。谢谢Richard,这与我在上面评论中提到的问题非常吻合。非常感谢。