如何在 SQL Server 中删除不精确的重复项

Posted

技术标签:

【中文标题】如何在 SQL Server 中删除不精确的重复项【英文标题】:How to remove non exact duplicates in SQL Server 【发布时间】:2020-06-28 00:47:12 【问题描述】:

目前,我可以从每个报告中获取数据,并按案例类型进行过滤,然后在案例打开和我想要的每个案例报告中再次过滤。

但是,作为一个案例可以在几个月内打开,我只想要它出现的第一个月。例如,可以在每个报告 201904、201905 中打开一个案例,然后在 201911 年重新打开,关于该案例的很多信息都发生了变化,所以它不是完全重复的,但是我只关注 201904 报告中的案例数据。

目前我正在使用以下代码

Select ReportDate, CaseNo, Est, CaseType
From output.casedata
Where casetype='family' and Status='Open' AND (
  Reportdate='201903' OR Reportdate='201904' OR Reportdate='201905'
  or Reportdate='201906' or Reportdate='201907' or Reportdate='201908'
  or Reportdate='201909' or Reportdate='201910' or Reportdate='201911'
  or Reportdate='201912' or Reportdate='202001' or Reportdate='202002'
)

【问题讨论】:

【参考方案1】:

如果我正确地遵循了您的要求,您希望每个案例的最早打开记录。

以下应该是你所期望的:

select c.*
from output.casedata c
where c.reportdate = (
    select min(c1.reportdate)
    where 
        c1.caseno = c.caseno
        and c1.casetype = 'family' 
        and c1.status = 'open' 
        and c1.reportdate between '201903' and '202002'
)

为了提高性能,您需要在(caseno, casttype, status, reportdate) 上建立索引。

请注意,我将reportdate 上的过滤器简化为使用between,而不是枚举所有可能的值。

【讨论】:

【参考方案2】:

您可以使用rank 窗口函数查找每个案例编号的第一个日期所在的行,然后从中获取所有详细信息:

SELECT *
FROM   (SELECT *, RANK() OVER (PARTITION BY CaseNo ORDER BY Reportdate) AS rk
        FROM   output.casedata
        WHERE  casetype = 'family' AND status='Open') t
WHERE  rk = 1

【讨论】:

完美的正是我所追求的。谢谢!

以上是关于如何在 SQL Server 中删除不精确的重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 SQL Server 中的某个列删除重复项? [复制]

SQL SERVER 2005删除重复数据

如何使用python pandas删除csv中列中的精确重复项

从 SQL Server 数据库中删除用户?

MS SQL - 查找和删除重复项[重复]

sqlserver 数据有重复怎么删除