SQL - 根据2列作为验证删除完全重复的记录行

时间:2014-09-24 06:42:40

标签: sql sql-server database tsql

我有一个名为Clients_Visits的数据库,我发现根据他们的访问日期和访问类型有很多重复记录的心室患者。我只是想知道是否有人可以帮我消除/删除占用空间的记录。

示例数据:

Clients_Visits:TBL

RecID | Customer_No | DateOfVisit | VisitType
--------------------------------------------
01    | 1001        | 01/05/2011  | 1
02    | 1001        | 01/05/2011  | 1
03    | 1002        | 06/09/2010  | 2
04    | 1004        | 07/08/2008  | 2
05    | 1001        | 01/05/2011  | 3

在我的示例表数据中。我想删除记录RecID 01或RecID 02(但是为了示例我放弃了RecID 02

RecID | Customer_No | DateOfVisit | VisitType
--------------------------------------------
 02    | 1001        | 01/05/2011  | 1

此记录属于同一

  • CUSTOMER_NO(1001)
  • DateOfVisit(01/05/2011)
  • VisitType(1) 考虑到每个访问日期只能有一种访问类型。

提前致谢。

其他说明:

抱歉,我认为自己和一些评论员感到困惑。

请注意,考虑到 RecID 05 的VisitType为3,下面的记录不是3个重复,因此我只需要删除1记录 RecID 01或RecID 02 根据DateOfvisit和VisitType

,它被认为是多余的
RecID | Customer_No | DateOfVisit | VisitType
   --------------------------------------------
    01    | 1001        | 01/05/2011  | 1
    02    | 1001        | 01/05/2011  | 1
    05    | 1001        | 01/05/2011  | 3

感谢。

3 个答案:

答案 0 :(得分:3)

假设您想保持最高recid,有几种方法可以做到这一点。一种是建立row_number并相应删除:

with cte as (
    select *, 
        row_number() over (partition by customer_no, dateofvisit
                           order by recid desc) rn
    from yourtable
)
delete from cte
where rn != 1

根据您的预期结果,我认为您不想将visitType添加到您的分区。


鉴于你的头衔,你实际上想要做这样的事情,但它并不匹配你想要的结果,因为这也会删除recid 5:

with cte as (
  select *, count(*) over (partition by customer_no, dateofvisit) cnt
  from yourtable
  ) 
delete from cte where cnt != 1

答案 1 :(得分:1)

因此,如果重复,您希望保留最新条目。这意味着当存在具有更高rec id的副本时,我们可以删除记录。

delete from clients_visits del 
where exists
(
  select *
  from clients_visits keep
  where keep.customer_no = del.customer_no
  and keep.dateofvisit = del.dateofvisit
  and keep.recid > del.recid
);

答案 2 :(得分:1)

此声明删除具有相同客户编号,访问日期和VisitType的所有记录。 具有最低RecID的记录保留在DB

DELETE
FROM Clients_Visits v1
WHERE EXISTS (SELECT RecID 
              FROM Clients_Visits v2 
              WHERE v1.Customer_No=v2.Customer_No
                  AND v1.DateOfVisit=v2.DateOfVisit
                  AND v1.VisitType=v2.VisitType
                  AND v1.RecID>v2.RecID)