【问题标题】:How to use RANK to Group Matched Records如何使用 RANK 对匹配的记录进行分组
【发布时间】:2021-04-09 07:21:39
【问题描述】:

长话短说。我有数据试图按地址识别重复记录。地址可以在[Address][Remit_Address] 字段上匹配。 我使用 JOIN 和 UNION 来获取记录,但我需要匹配的记录在结果中相互显示。

我无法按任何现有字段排序,因此典型的“ORDER BY”不起作用。我按照某人的建议查看了RANK,看起来它可能有效,但我不知道如何进行分区,我认为订单给了我与ORDER BY 相同的问题。

如果 RANK 不是最佳选择,我愿意接受其他想法。最终目标是以某种方式对匹配的记录进行分组。

  • SSMS 18
  • SQL Server 2019

设置如下:

-- Output Table
CREATE TABLE [dupecheck] (
  [id] int identity(1, 1), 
  [Data Area] varchar(255), 
  [Supplier_No] varchar(255), 
  [Name] varchar(255), 
  [Address] varchar(255), 
  [City] varchar(255), 
  [State] varchar(255), 
  [Zip] varchar(255), 
  [Country] varchar(255), 
  [Remit_Address] varchar(255), 
  [Remit_City] varchar(255), 
  [Remit_State] varchar(255), 
  [Remit_Zip] varchar(255), 
  [Remit_Country] varchar(255), 
)


CREATE TABLE [sample_data] (
    [Supplier_No]           varchar(255),
    [Name]                  varchar(255),
    [Address]               varchar(255),
    [City]                  varchar(255),
    [State]                 varchar(255),
    [Zip]                   varchar(255),
    [Country]               varchar(255),
    [Remit_Address]         varchar(255),
    [Remit_City]            varchar(255),
    [Remit_State]           varchar(255),
    [Remit_Zip]             varchar(255),
    [Remit_Country]         varchar(255),
    [cleanAddress]          varchar(255),
    [cleanRemit_Address]    varchar(255),
    CONSTRAINT [suppliers_pk] PRIMARY KEY ([Supplier_No])
)

INSERT INTO [sample_data] VALUES
    ('1039104','Geez Companies','100 Aero Hudson Rd','Streetsboro','OH','44241','','100 Aero Hudson Road','Streetsboro','OH','44241','USA','100 Aero Hudson Rd','100 Aero Hudson Rd'),
    ('1218409','SouthWestern Medical','100 West Balor Ave','Osceola','AR','72370','USA','SouthWestern Medical100 W Balor Ave','Osceola','AR','72370','USA','100 W Balor Ave','SouthWestern Medical100 W Balor Ave'),
    ('1243789','SouthWestern Medical','100 West Balor Ave','Osceola','AR','72370','USA','SouthWestern Medical100 West Balor Ave','Osceola','AR','72370','USA','100 W Balor Ave','SouthWestern Medical100 W Balor Ave'),
    ('1243636','SIRI SYSTEMS','15 BRAD ROAD','WEXFORD','PA','15090','','','','','','','15 BRAD RD',''),
    ('1152482','FLEETWOOD MACK','22 WINDSOCK CT','ADDISON','IL','60101','','PO BOX 951','CHICAGO','IL','60694-5124','','22 WINDSOCK CT','PO BOX 951'),
    ('1224483','Aerospace Junction','211500 Communicate Ave','Mingo Junction','OH','43939','USA','P O Box 99','Mingo Junction','OH','43939','USA','211500 Communicate Ave','PO Box 99'),
    ('1243397','Squeezy Felt','SCHREIBER DIST','NEW KENSINGTON','PA','15068','','','','','','','SCHREIBER DIST',''),
    ('1230895','NERO CO','28 North US State Highway 99','Osceola','AR','72370','USA','PO Box 204','Cape Girardeau','MO','63702-2045','USA','28 N US State Hwy 99','PO Box 204'),
    ('1243782','NERO CO','28 North US State Highway 99','Osceola','AR','72370','USA','PO Box 204','Cape Girardeau','MO','63702-2045','USA','28 N US State Hwy 99','PO Box 204'),
    ('1135880','RICHARD PRYOR SEMINARS','PO BOX 2194','KANSAS CITY','MO','64121-9468','USA','RICHARD PRYOR SEMINARS P O BOX 2194','KANSAS CITY','MO','64121-9468','USA','PO BOX 2194','RICHARD PRYOR SEMINARS PO BOX 2194'),
    ('1241328','INFINITY AND BEYOND','P.O. BOX 169','GASTONIA','NC','28053-0269','USA','','','','','','PO BOX 169',''),
    ('1259522','ZEEBO INC','PO BOX 169','GASSTONIA','NC','28053-0269','USA','','','','','','PO BOX 169',''),
    ('1255253','AT&T','PO Box 50221','Carol Stream','IL','60197','USA','','','','','','PO Box 50221',''),
    ('1135513','AT&T','PO Box 50221','Carol Stream','IL','60197-5080','USA','','','','','','PO Box 50221',''),
    ('1119161','Machine Co, Inc','3306 N Thorne Blvd','Chattanooga','TN','','','PO BOX 5301','CHATTANOOGA','TN','37406','USA','3306 N Thorne Blvd','PO BOX 5301'),
    ('1176587','Topsy Turvy','365 Welmington Road','Chicago','IL','60606','USA','','','','','','365 Welmington Rd',''),
    ('2156671','Topsy Turvvy, Inc.','P.O. Box 55217','Columbus','OH','43081','','365 Welmington Road','Chicago','IL','60606','USA','','365 Welmington Rd')


CREATE TABLE [dupe_addresses](
    [NewAdd] [varchar](255) NULL
)

INSERT INTO [dupe_addresses] VALUES
    ('100 W Balor Ave'),
    ('28 N US State Hwy 99'),
    ('365 Welmington Rd'),
    ('PO BOX 169'),
    ('PO Box 204'),
    ('PO Box 50221'),
    ('SouthWestern Medical100 W Balor Ave')

现有查询:

INSERT INTO [dupecheck]
    SELECT * FROM (
    SELECT 
        'Address Match' AS [Reason], 
        pv.[Supplier_No], 
        pv.[Name], 
        pv.[Address], 
        pv.[City], 
        pv.[State], 
        pv.[Zip], 
        pv.[Country], 
        pv.[Remit_Address], 
        pv.[Remit_City], 
        pv.[Remit_State], 
        pv.[Remit_Zip], 
        pv.[Remit_Country]
         FROM [dupe_addresses] n 
      LEFT JOIN [sample_data] pv 
        ON 
        (n.[NewAdd] = pv.[cleanAddress] AND ( [Address] <> '' AND [Address] IS NOT NULL ) )
       WHERE ([Supplier_No] IS NOT NULL AND [Supplier_No] <> '') 

    UNION

    SELECT 
        'Address Match' AS [Reason], 
        pv.[Supplier_No], 
        pv.[Name], 
        pv.[Address], 
        pv.[City], 
        pv.[State], 
        pv.[Zip], 
        pv.[Country], 
        pv.[Remit_Address], 
        pv.[Remit_City], 
        pv.[Remit_State], 
        pv.[Remit_Zip], 
        pv.[Remit_Country]
         FROM [dupe_addresses] n 
      LEFT JOIN [sample_data] pv 
        ON 
        (n.[NewAdd] = pv.[cleanRemit_Address] AND ( [Remit_Address] <> '' AND [Remit_Address] IS NOT NULL) )
       WHERE ([Supplier_No] IS NOT NULL AND [Supplier_No] <> '') 
       ) q1

当前结果:

Reason  Supplier_No Name    Address City    State   Zip Country Remit_Address   Remit_City  Remit_State Remit_Zip   Remit_Country
Address Match   1135513 AT&T    PO Box 50221    Carol Stream    IL  60197-5080  USA                 
Address Match   1176587 Topsy Turvy 365 Welmington Road Chicago IL  60606   USA                 
Address Match   1218409 SouthWestern Medical    100 West Balor Ave  Osceola AR  72370   USA SouthWestern Medical100 W Balor Ave Osceola AR  72370   USA
Address Match   1230895 NERO CO 28 North US State Highway 99    Osceola AR  72370   USA PO Box 204  Cape Girardeau  MO  63702-2045  USA
Address Match   1241328 INFINITY AND BEYOND P.O. BOX 169    GASTONIA    NC  28053-0269  USA                 
Address Match   1243782 NERO CO 28 North US State Highway 99    Osceola AR  72370   USA PO Box 204  Cape Girardeau  MO  63702-2045  USA
Address Match   1243789 SouthWestern Medical    100 West Balor Ave  Osceola AR  72370   USA SouthWestern Medical100 West Balor Ave  Osceola AR  72370   USA
Address Match   1255253 AT&T    PO Box 50221    Carol Stream    IL  60197   USA                 
Address Match   1259522 ZEEBO INC   PO BOX 169  GASSTONIA   NC  28053-0269  USA                 
Address Match   2156671 Topsy Turvvy, Inc.  P.O. Box 55217  Columbus    OH  43081       365 Welmington Road Chicago IL  60606   USA

期望的结果:

Reason  Supplier_No Name    Address City    State   Zip Country Remit_Address   Remit_City  Remit_State Remit_Zip   Remit_Country   rank
Address Match   1135513 AT&T    PO Box 50221    Carol Stream    IL  60197-5080  USA                     1
Address Match   1255253 AT&T    PO Box 50221    Carol Stream    IL  60197   USA                     1
Address Match   1241328 INFINITY AND BEYOND P.O. BOX 169    GASTONIA    NC  28053-0269  USA                     2
Address Match   1259522 ZEEBO INC   PO BOX 169  GASSTONIA   NC  28053-0269  USA                     2
Address Match   1243782 NERO CO 28 North US State Highway 99    Osceola AR  72370   USA PO Box 204  Cape Girardeau  MO  63702-2045  USA 3
Address Match   1230895 NERO CO 28 North US State Highway 99    Osceola AR  72370   USA PO Box 204  Cape Girardeau  MO  63702-2045  USA 3
Address Match   1218409 SouthWestern Medical    100 West Balor Ave  Osceola AR  72370   USA SouthWestern Medical100 W Balor Ave Osceola AR  72370   USA 4
Address Match   1243789 SouthWestern Medical    100 West Balor Ave  Osceola AR  72370   USA SouthWestern Medical100 West Balor Ave  Osceola AR  72370   USA 4
Address Match   2156671 Topsy Turvvy, Inc.  P.O. Box 55217  Columbus    OH  43081       365 Welmington Road Chicago IL  60606   USA 5
Address Match   1176587 Topsy Turvy 365 Welmington Road Chicago IL  60606   USA                     5

【问题讨论】:

  • 赞成详细程度。
  • 在 [dupecheck] 表中添加一个 [NewAdd] 列并将其用于排序/排名
  • 行数可以吗?
  • @Serg 但是 NewAdd 字段中有什么? [cleanAddress][cleanRemit_Address] 这与 ORDER BY 的问题相同。如果我在每个 SELECTS 中添加它,那么 NERO 将在 [cleanAddress] 上匹配,在 [cleanRemit_Address] 上匹配另一个。我使用 UNION 删除这些重复项,但添加另一个字段会搞砸。废话,RANK 可能会造成类似的问题。我在这里敲我的头!
  • 真的,您的样本数据有 14 个匹配项,UNION 将这些匹配项减少到 10 个。看起来这样一些信息会丢失,从而无法正确分组。

标签: sql sql-server tsql ranking


【解决方案1】:

此查询创建所需的结果。

with cte as (
    select s2.NewAdd grp, s1.*
        , rank() over(partition by Supplier_No order by s2.NewAdd) rnk
    from sample_data s1
    inner join dupe_addresses s2 on  
        (s1.cleanAddress=s2.newAdd) or (s1.cleanRemit_Address=s2.newAdd)
)
select c1.*
from cte c1
where rnk = 1
order by c1.grp

删除了 Union ,并改为通过 OR 组合两个连接条件。 因此可以找到同时具有这两个条件的记录。

rank() 用于计算结果集分区内每一行的排名。

partition by Supplier_No 用于识别重复记录。

最后,使用where rnk = 1 来查看不重复的记录组。

【讨论】:

  • 这是我所拥有的更清洁的 JOIN,但仍然没有将匹配的记录组合在一起。
  • 您的回答与我的“当前结果”完全相同。 AT&T 在数据中两次使用相同的地址但不同的供应商编号。当您查看输出时,一条记录位于第 1 行,另一条位于第 8 行。如果您查看“Desired Results”,您可以看到所有这些都组合在一起。 “Infinity and Beyond”和“Zeebo”也有相同的地址,所以如果它们没有分组并且按名称或地址排序,那么记录可能会被巨大的数字分隔,使得评估非常困难和耗时。跨度>
  • 我正在编辑代码,这个新代码也进行了分组。 (有些记录匹配两个字段和两个组,如果你也想看到它们,应该删除where rnk=1
  • @RezaBasereh 要获得高质量的答案,请实际解释它的作用以及添加工作代码。
  • 这很好用,谢谢!正如@DaleK 建议的那样,一些解释可以很好地帮助可能有类似问题的其他人。我知道这些年来我从其他人的问题和答案中学到了很多:D
【解决方案2】:

首先,您可以通过提及on clause 中的两个条件来避免使用昂贵的union,如下所示:

  ON 
  (n.[NewAdd] = pv.[cleanAddress] AND ( [Address] <> '' AND [Address] IS NOT NULL ) )
  or 
  (n.[NewAdd] = pv.[cleanRemit_Address] AND ( [Remit_Address] <> '' AND [Remit_Address] IS NOT NULL) )

然后您可以借助 row_number()over() 窗口函数删除每个供应商编号的重复行。

然后根据它们的地址对这些行进行排名

dense_rank()over(order by case when(n.[NewAdd] = pv.[cleanAddress] AND ( [Address] < '' AND [Address] IS NOT NULL ) )
             then cleanaddress else Remit_Address end)

但我不明白你是如何组成四行的第 4 组的。

查询:

 with cte 
 as
 (
     SELECT 
         'Address Match' AS [Reason], 
         pv.[Supplier_No], 
         pv.[Name], 
         pv.[Address], 
         pv.[City], 
         pv.[State], 
         pv.[Zip], 
         pv.[Country], 
         pv.[Remit_Address], 
         pv.[Remit_City], 
         pv.[Remit_State], 
         pv.[Remit_Zip], 
         pv.[Remit_Country],
         row_number()over (partition by supplier_no order by address  ,remit_address )rn,
         dense_rank()over(order by case when(n.[NewAdd] = pv.[cleanAddress] AND ( [Address] < '' AND [Address] IS NOT NULL ) )
         then cleanaddress else Remit_Address end) rnk
          FROM [dupe_addresses] n 
       LEFT JOIN [sample_data] pv 
         ON 
         (n.[NewAdd] = pv.[cleanAddress] AND ( [Address] < '' AND [Address] IS NOT NULL ) )
         or 
          (n.[NewAdd] = pv.[cleanRemit_Address] AND ( [Remit_Address] < '' AND [Remit_Address] IS NOT NULL) )
        WHERE [Supplier_No] IS NOT NULL AND [Supplier_No] < ''
 )
 select * from cte where rn=1
 order by rnk desc
Reason Supplier_No Name Address City State Zip Country Remit_Address Remit_City Remit_State Remit_Zip Remit_Country rn rnk
Address Match 1135513 AT&T PO Box 50221 Carol Stream IL 60197-5080 USA 1 7
Address Match 1255253 AT&T PO Box 50221 Carol Stream IL 60197 USA 1 7
Address Match 1259522 ZEEBO INC PO BOX 169 GASSTONIA NC 28053-0269 USA 1 5
Address Match 1241328 INFINITY AND BEYOND P.O. BOX 169 GASTONIA NC 28053-0269 USA 1 5
Address Match 2156671 Topsy Turvvy, Inc. P.O. Box 55217 Columbus OH 43081 365 Welmington Road Chicago IL 60606 USA 1 4
Address Match 1176587 Topsy Turvy 365 Welmington Road Chicago IL 60606 USA 1 3
Address Match 1230895 NERO CO 28 North US State Highway 99 Osceola AR 72370 USA PO Box 204 Cape Girardeau MO 63702-2045 USA 1 2
Address Match 1243782 NERO CO 28 North US State Highway 99 Osceola AR 72370 USA PO Box 204 Cape Girardeau MO 63702-2045 USA 1 2
Address Match 1218409 SouthWestern Medical 100 West Balor Ave Osceola AR 72370 USA SouthWestern Medical100 W Balor Ave Osceola AR 72370 USA 1 1
Address Match 1243789 SouthWestern Medical 100 West Balor Ave Osceola AR 72370 USA SouthWestern Medical100 West Balor Ave Osceola AR 72370 USA 1 1

dbhere

【讨论】:

  • 第 4 组很好,这是一个不幸的复制/粘贴错误。我已经纠正了,最后两个是第 5 组。我使用 cte 和行号来删除欺骗,但我也无法理解如何添加排名。 CTE 和行号都让我感到困惑,所以我有点挣扎:D
  • 我会花一些时间来看看它是如何处理我更大的数据集的。看起来这可能就是我要找的东西。
  • 祝你好运。如果您遇到任何困难,请告诉我。
  • 在我更大的数据集(大约 100k 条记录)上,它给了我正确的记录数,但排名不高。当一条记录的 [cleanAddress] 与另一条记录中的 [cleanRemit_Address] 字段匹配时,这看起来与我遇到的问题相同。
  • Reza's 给了我正确的排名和记录数。感谢您的详细回答,我已将其保存以供将来参考行和排名!
【解决方案3】:

我确信有一种更短/更清洁的方法可以做到这一点,但是当我等待我的咖啡喝完时,下面应该做你想做的事。

SELECT s1.*
    ,coalesce((
            SELECT s1.Cleanaddress
            FROM dupe_addresses s2
            WHERE s1.cleanAddress = s2.newAdd
            ), (
            SELECT s1.cleanRemit_Address
            FROM dupe_addresses s2
            WHERE s1.cleanRemit_Address = s2.newAdd
            )) AS MatchedAddress
FROM sample_data s1
WHERE EXISTS (
        SELECT 1
        FROM dupe_addresses s2
        WHERE (s1.cleanAddress = s2.newAdd)
            OR (s1.cleanRemit_Address = s2.newAdd)
        )
ORDER BY MatchedAddress

编辑:我已经考虑了更多。我会改变你这样做的方式,因为你说你有更多的标准来匹配这将是实现你想要的更好的方法。基本上我会在您的供应商/数据表上创建一个 CleanedAddressID,然后将所有已清理的地址放入已清理的地址表中。

完成后,您可以更新 CleanedAddressID,并且可以使用比当前使用更多的条件/匹配。

以下代码应该可以帮助您,最终查询将根据地址返回所有重复项。

随着时间的推移,您可以以类似的方式添加不同的匹配项,然后创建重复分数。我知道这超出了您的问题的范围,但我想我会提到它,因为它显示了这种更具动态性的解决方案如何使其更易于扩展。

我已经离开了上面的解决方案,就像你说的那样,这就是你想要的,我会让你消化它,但它很混乱,而且随着标准的增加会变得更混乱。

CREATE TABLE [CleanedAddresses] (
    ID INT IDENTITY(1, 1)
    ,[Address] [varchar](255) NOT NULL UNIQUE
    ,PRIMARY KEY (ID)
    )

INSERT INTO [CleanedAddresses] ([Address])
VALUES ('100 W Balor Ave')
    ,('28 N US State Hwy 99')
    ,('365 Welmington Rd')
    ,('PO BOX 169')
    ,('PO Box 204')
    ,('PO Box 50221')
    ,('SouthWestern Medical100 W Balor Ave')

CREATE TABLE [sample_data] (
    [Supplier_No] VARCHAR(255)
    ,[Name] VARCHAR(255)
    ,[Address] VARCHAR(255)
    ,[City] VARCHAR(255)
    ,[State] VARCHAR(255)
    ,[Zip] VARCHAR(255)
    ,[Country] VARCHAR(255)
    ,[Remit_Address] VARCHAR(255)
    ,[Remit_City] VARCHAR(255)
    ,[Remit_State] VARCHAR(255)
    ,[Remit_Zip] VARCHAR(255)
    ,[Remit_Country] VARCHAR(255)
    ,[cleanAddress] VARCHAR(255)
    ,[cleanRemit_Address] VARCHAR(255)
    ,CleanAddressID INT NULL CONSTRAINT [suppliers_pk] PRIMARY KEY ([Supplier_No])
    ,FOREIGN KEY (CleanAddressID) REFERENCES [CleanedAddresses](ID)
    )

INSERT INTO [sample_data] (
    [Supplier_No]
    ,[Name]
    ,[Address]
    ,[City]
    ,[State]
    ,[Zip]
    ,[Country]
    ,[Remit_Address]
    ,[Remit_City]
    ,[Remit_State]
    ,[Remit_Zip]
    ,[Remit_Country]
    ,[cleanAddress]
    ,[cleanRemit_Address]
    )
VALUES (
    '1039104'
    ,'Geez Companies'
    ,'100 Aero Hudson Rd'
    ,'Streetsboro'
    ,'OH'
    ,'44241'
    ,''
    ,'100 Aero Hudson Road'
    ,'Streetsboro'
    ,'OH'
    ,'44241'
    ,'USA'
    ,'100 Aero Hudson Rd'
    ,'100 Aero Hudson Rd'
    )
    ,(
    '1218409'
    ,'SouthWestern Medical'
    ,'100 West Balor Ave'
    ,'Osceola'
    ,'AR'
    ,'72370'
    ,'USA'
    ,'SouthWestern Medical100 W Balor Ave'
    ,'Osceola'
    ,'AR'
    ,'72370'
    ,'USA'
    ,'100 W Balor Ave'
    ,'SouthWestern Medical100 W Balor Ave'
    )
    ,(
    '1243789'
    ,'SouthWestern Medical'
    ,'100 West Balor Ave'
    ,'Osceola'
    ,'AR'
    ,'72370'
    ,'USA'
    ,'SouthWestern Medical100 West Balor Ave'
    ,'Osceola'
    ,'AR'
    ,'72370'
    ,'USA'
    ,'100 W Balor Ave'
    ,'SouthWestern Medical100 W Balor Ave'
    )
    ,(
    '1243636'
    ,'SIRI SYSTEMS'
    ,'15 BRAD ROAD'
    ,'WEXFORD'
    ,'PA'
    ,'15090'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'15 BRAD RD'
    ,''
    )
    ,(
    '1152482'
    ,'FLEETWOOD MACK'
    ,'22 WINDSOCK CT'
    ,'ADDISON'
    ,'IL'
    ,'60101'
    ,''
    ,'PO BOX 951'
    ,'CHICAGO'
    ,'IL'
    ,'60694-5124'
    ,''
    ,'22 WINDSOCK CT'
    ,'PO BOX 951'
    )
    ,(
    '1224483'
    ,'Aerospace Junction'
    ,'211500 Communicate Ave'
    ,'Mingo Junction'
    ,'OH'
    ,'43939'
    ,'USA'
    ,'P O Box 99'
    ,'Mingo Junction'
    ,'OH'
    ,'43939'
    ,'USA'
    ,'211500 Communicate Ave'
    ,'PO Box 99'
    )
    ,(
    '1243397'
    ,'Squeezy Felt'
    ,'SCHREIBER DIST'
    ,'NEW KENSINGTON'
    ,'PA'
    ,'15068'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'SCHREIBER DIST'
    ,''
    )
    ,(
    '1230895'
    ,'NERO CO'
    ,'28 North US State Highway 99'
    ,'Osceola'
    ,'AR'
    ,'72370'
    ,'USA'
    ,'PO Box 204'
    ,'Cape Girardeau'
    ,'MO'
    ,'63702-2045'
    ,'USA'
    ,'28 N US State Hwy 99'
    ,'PO Box 204'
    )
    ,(
    '1243782'
    ,'NERO CO'
    ,'28 North US State Highway 99'
    ,'Osceola'
    ,'AR'
    ,'72370'
    ,'USA'
    ,'PO Box 204'
    ,'Cape Girardeau'
    ,'MO'
    ,'63702-2045'
    ,'USA'
    ,'28 N US State Hwy 99'
    ,'PO Box 204'
    )
    ,(
    '1135880'
    ,'RICHARD PRYOR SEMINARS'
    ,'PO BOX 2194'
    ,'KANSAS CITY'
    ,'MO'
    ,'64121-9468'
    ,'USA'
    ,'RICHARD PRYOR SEMINARS P O BOX 2194'
    ,'KANSAS CITY'
    ,'MO'
    ,'64121-9468'
    ,'USA'
    ,'PO BOX 2194'
    ,'RICHARD PRYOR SEMINARS PO BOX 2194'
    )
    ,(
    '1241328'
    ,'INFINITY AND BEYOND'
    ,'P.O. BOX 169'
    ,'GASTONIA'
    ,'NC'
    ,'28053-0269'
    ,'USA'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'PO BOX 169'
    ,''
    )
    ,(
    '1259522'
    ,'ZEEBO INC'
    ,'PO BOX 169'
    ,'GASSTONIA'
    ,'NC'
    ,'28053-0269'
    ,'USA'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'PO BOX 169'
    ,''
    )
    ,(
    '1255253'
    ,'AT&T'
    ,'PO Box 50221'
    ,'Carol Stream'
    ,'IL'
    ,'60197'
    ,'USA'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'PO Box 50221'
    ,''
    )
    ,(
    '1135513'
    ,'AT&T'
    ,'PO Box 50221'
    ,'Carol Stream'
    ,'IL'
    ,'60197-5080'
    ,'USA'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'PO Box 50221'
    ,''
    )
    ,(
    '1119161'
    ,'Machine Co, Inc'
    ,'3306 N Thorne Blvd'
    ,'Chattanooga'
    ,'TN'
    ,''
    ,''
    ,'PO BOX 5301'
    ,'CHATTANOOGA'
    ,'TN'
    ,'37406'
    ,'USA'
    ,'3306 N Thorne Blvd'
    ,'PO BOX 5301'
    )
    ,(
    '1176587'
    ,'Topsy Turvy'
    ,'365 Welmington Road'
    ,'Chicago'
    ,'IL'
    ,'60606'
    ,'USA'
    ,''
    ,''
    ,''
    ,''
    ,''
    ,'365 Welmington Rd'
    ,''
    )
    ,(
    '2156671'
    ,'Topsy Turvvy, Inc.'
    ,'P.O. Box 55217'
    ,'Columbus'
    ,'OH'
    ,'43081'
    ,''
    ,'365 Welmington Road'
    ,'Chicago'
    ,'IL'
    ,'60606'
    ,'USA'
    ,''
    ,'365 Welmington Rd'
    )

UPDATE S
SET CleanAddressID = c.ID
FROM Sample_data S
INNER JOIN CleanedAddresses C ON c.Address = s.cleanAddress

UPDATE S
SET CleanAddressID = c.ID
FROM Sample_data S
INNER JOIN CleanedAddresses C ON c.Address = s.cleanRemit_Address
WHERE s.CleanAddressID IS NULL

SELECT *
FROM Sample_data S
WHERE CleanAddressID IS NOT NULL
    AND cleanAddressID IN (
        SELECT s2.cleanAddressID
        FROM sample_data s2
        GROUP BY s2.cleanAddressID
        HAVING count(*) > 1
        )
ORDER BY CleanAddressID

【讨论】:

  • 这确实给了我想要的东西!我需要花一些时间来理解它,以便我可以扩展它并添加额外的地址字段:D 现在已经很晚/很早了,所以我会在明天中午时分回来向上:D
  • 匹配的方式越多,就会越乱。我假设您正在尝试匹配所有记录以查找重复项。我建议创建一个名为说 CleanedAddresses 的表,然后通过您作为清洁工拥有的任何地址来处理您的所有地址,并将它们的不同列表插入到表 CleanedAddresses 中,并将 Identity 列作为 PK。然后,您可以对该 CleanedAddresses 表执行各种连接,然后按 CleanedAddresses 上的 ID 进行排序。这将更加清洁和高效。
  • 我实际上按照您的建议做了很多。样本数据具有已清理的地址。最大的问题是有些记录有 2-3 个地址,而这些地址有 1-3 个地址行。所以我不能有一个清理过的地址字段,我可能有 9 个,我需要检查所有这些。我的问题中的[dupe_addresses] 表与您的[CleanedAddresses] 相同。我刚去拿咖啡,我会坐下来看看。
  • 很高兴听到您已经开始这样做了。我的建议仍然是您添加一个新列并更新它。为了清楚起见,您可以将其称为 DupeaddressID。如果您可以根据不同的标准有多个重复项,那么您可以有一个中间多对多表。创建表重复(ID INT IDENTITY(1,1) Primary Key, SupplierID, DuplicateAddressID)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2019-07-19
  • 2021-08-27
相关资源
最近更新 更多