我有一个名为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
此记录属于同一
提前致谢。
其他说明:
抱歉,我认为自己和一些评论员感到困惑。
请注意,考虑到 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
感谢。
答案 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)