【问题标题】:Find duplicate records in two group of data in one sql server table在一个sql server表中查找两组数据中的重复记录
【发布时间】:2013-04-24 14:39:41
【问题描述】:

我有一个包含一组数据的 sql server (2008) 表。

Source    PersonId    Date      Description   Code     IsDup
------    --------    -----     -----------   ------   ----- 
EHR       1234        1/1/2012  Fever         120.12
EHR       1234        6/1/2012  Fracture      101.00
EHR       1234        11/4/2012 Hypertension  223.15
RAM       1234        1/1/2012  Fever         120.12              <-- Duplicate
RAM       1234        6/1/2012  Fracture      101.00              <-- Duplicate
RAM       1234        4/1/2012  Diabetic      601.00
TAR       1234        2/1/2012  Asthma        456.00
TAR       1234        1/1/2012  Fever         120.12              <-- Duplicate

我需要比较不同组之间的数据。 “EHR”是主组,我需要检查是否有任何其他组的数据与表中“EHR”主组中的数据完全匹配。然后它应该用 1 更新 IsDup 列。

预期结果:

Source    PersonId    Date      Description   Code     IsDup
------    --------    -----     -----------   ------   ----- 
EHR       1234        1/1/2012  Fever         120.12
EHR       1234        6/1/2012  Fracture      101.00
EHR       1234        11/4/2012 Hypertension  223.15
RAM       1234        1/1/2012  Fever         120.12     1
RAM       1234        6/1/2012  Fracture      101.00     1
RAM       1234        4/1/2012  Diabetic      601.00
TAR       1234        2/1/2012  Asthma        456.00
TAR       1234        1/1/2012  Fever         120.12     1

我知道如何检查表中的重复项,但不确定我们如何在保持一组静态的情况下进行比较。

我从其中一个 stackoverflow 线程中得到了这个来识别重复,但是如何添加分组比较:

with x as   (select  *, rn = row_number()
            over(PARTITION BY [PersonId], [Date], [Description], [Code] order by [PersonId], [Date], [Description], [Code])
            from    Results)

select * from x
where rn > 1

【问题讨论】:

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以使用自联接更新您的表格:

update r1 set isDup = 1
from results r1 join results r2 on 
     r1.PersonId = r2.PersonId and r1.Date = r2.Date and 
     r1.Description = r2.Description and r1.Code = r2.Code 
where r1.Source <> 'EHR' and r2.Source = 'EHR'

【讨论】:

  • 谢谢,它按预期工作。 Lamak 的解决方案也很棒,但我们更喜欢自我加入而不是存在。
【解决方案2】:

应该这样做:

UPDATE A
SET IsDup = 1 
FROM YourTable A
WHERE [Source] != 'EHR'
AND EXISTS (SELECT 1 FROM YourTable
            WHERE [Source] = 'EHR'
            AND PersonId = A.PersonId 
            AND [Date] = A.[Date]
            AND Description = A.Description
            AND Code = A.Code)

Here is a demo你试试。

【讨论】:

  • 感谢 Lamak 的解决方案和演示。我不知道也有一个 sqlfiddle。谢谢你教育我。过去,我们遇到了 EXISTS 问题,因此我们的 DBA 更喜欢自我加入。
  • @kuul13 是的,sqlfiddle 是一个很棒的工具。好吧,我不知道您的 DBA 过去对 EXISTS 有什么“问题”,但我认为这可能是对其工作方式的误解。为了保持“教育”部分,我建议您(和您的 DBA)看看这篇博文:explainextended.com/2009/06/16/in-vs-join-vs-exists
【解决方案3】:

试试这个:

;With rootQuery as 
(
Select  SOURCE, PersonId, Date, Description, Code
From    MedicalHistory 
Where   Source = 'EHR'
)
Update mhd
Set IsDuplicate = 1
From    rootquery mh 
Join    MedicalHistory mhd on mh.PersonId = mhd.PersonId
Where   mh.Description = mhd.Description
And     mh.Code = mhd.Code
And         mh.Date = mhd.Date
And     mhd.Source != 'EHR'

【讨论】:

    【解决方案4】:

    请试试这个..

       update tab
       set tab1.isDup=1
       from table1 tab1, table1 tab2
       where 
       tab1.PersonId=tab1.PersonId and
       tab1.Date=tab2.Date and
       tab1.desription=tab2.desription and
       tab1.Code=tab2.Code and
       tab1.Source != tab2.source 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多