Sql 删除/忽略表中的重复记录并仅保留最早的记录

Sql 删除/忽略表中的重复记录并仅保留最早的记录,sql,sql-server,database,Sql,Sql Server,Database,我需要一个SQL查询来删除下图中的重复项。假设表的名称为Opens。 正如您所看到的,有很多记录在Id、SendQueueId、SubscriberId和Email中几乎相同。唯一不同的是他们的约会时间。我只需要从每个Id中选择一个,这样我的Id将是唯一的,并且只保留最早的Id。使用一个公共表表达式,使用ROW_NUMBER函数识别重复项,并删除指定为第一个Id之外的所有出现项 ;with cte as ( select *, row_number() over (

我需要一个SQL查询来删除下图中的重复项。假设表的名称为Opens。


正如您所看到的,有很多记录在Id、SendQueueId、SubscriberId和Email中几乎相同。唯一不同的是他们的约会时间。我只需要从每个Id中选择一个,这样我的Id将是唯一的,并且只保留最早的Id。

使用一个公共表表达式,使用ROW_NUMBER函数识别重复项,并删除指定为第一个Id之外的所有出现项

;with cte as (
  select *, 
    row_number() over (
      partition by Id, SendQueueId, SubscriberId, Email, WP_CampaignId
      order by DateTime
    ) as RN
  from
    Opens
)

delete
  cte
where
  RN > 1

使用标准sql的另一个解决方案:


…你可能不想在互联网上显示人们的电子邮件地址。@anaximander你可能想找到解决问题的方法cz这就是我来这里的原因。有点不必要。。。如果我有一个解决方案,我会发布它,但与此同时,我只是想帮助你指出,这些电子邮件地址的所有者可能不希望他们像那样发布到网上。“不用打。”阿那克西曼德谢谢,下次我会小心的。 delete from opens a where not exists (Select * From (select Id, SendQueueId, SubscriberId, Email, WP_CampaignId, min(date_time) date_time From opens group by Id, SendQueueId, SubscriberId, Email, WP_CampaignId) b Where a.id = b.id and a.SendQueueId = b.SendQueueId and a.SubscriberId = b.SubscriberId and a.Email = b.Email and a.WP_CampaignId = b.WP_CampaignId);