试图在记录中找到重复,其中地址仅在一个字段中有所不同,并且只有一定数量

时间:2013-12-31 17:43:10

标签: sql duplication

我有一个包含NAP字段的列表表格,我希望在其中找到重复内容 - 特别是除了门牌号码(2或3位数字内)之外的所有内容都相同。

我的表看起来像这样:

Name Housenumber Streetname   Streettype City       State  Zip
1    36          Smith        St         Norwalk    CT     6851
2    38          Smith        St         Norwalk    CT     6851
3     1          Kennedy      Ave        Campbell   CA     95008
4     4          Kennedy      Ave        Campbell   CA     95008

我想知道如何设置qry来查找这些记录。

我尝试了一些但却无法弄清楚如何做到这一点 - 任何帮助都会受到赞赏。

由于

2 个答案:

答案 0 :(得分:2)

您是否希望找到能够显示此类行数的内容?

SELECT 
    StreenName,
    City,
    State,
    Zip,
    COUNT(*)
FROM YourTable
group by StreenName, City, State, Zip
HAVING COUNT(*) >1

或者尝试查找具有相同街道,城市,州和邮政编码的所有行?

SELECT 
    A.HouseNumber,
    A.StreetName,
    A.City,
    A.State,
    A.Zip
FROM YourTable as A
INNER JOIN YourTable as B
    ON A.StreetName = B.StreetName
    AND A.City = B.City
    AND A.State = B.State
    AND A.Zip = B.Zip
    AND A.HouseNumber <> B.HouseNumber

答案 1 :(得分:0)

这是一种方法。您需要一个唯一的ID才能运行此表,因为您不希望选择完全相同的人(如果他们是唯一的那个人)。这只会吐出至少有一个副本的所有结果。

编辑:Woops,刚刚在评论中意识到varchar表示街道号码......嗯。所以你可以在它上面运行一个演员。 OP从未说过varchar中的门牌号码或者原帖中的字母和数字。至于街道号码领域的信件,我过去2年来一直是第三方运输提供商,我从未见过一个;除了apt之外,这将是一个diff字段。它有可能是因为某些其他原因(导致0的)将varchar放在那里,或者没有理由。在没有OP的回应的情况下,可能存在,但没有办法知道该领域的什么。要为每个实例运行强制转换为int,除此之外:Cast(mt.HouseNumber as int)

 select *
 from MyTable mt
 where exists (select 1
               from MyTable mt2
               where mt.name = mt2.name
               and mt.street = mt2.street
               and mt.state = mt2.state
               and mt.city = mt2.city
               and mt2.HouseNumber between (mt.HouseNumber -3) and (mt.HouseNumber +3)
               and mt.UID != mt2.UID
               )
 order by mt.state, mt.city, mt.street
 ;

如果有来信的话,不知道如何运行-3 + 3 ......除非你知道他们在哪里,你可以简单地将它们剪掉然后再投射。