【问题标题】:SQL insert into, deleting duplicate rows that have some matching info and same IDSQL插入,删除具有一些匹配信息和相同ID的重复行
【发布时间】:2019-11-28 00:39:15
【问题描述】:

场景:我有一个客户订单主文件。我需要将一些列导入客户表(名称、地址等)并自动创建客户 ID。然后将主文件中的其余列导入订单表(日期、代理 ID、加入新创建的客户 ID)。 该过程运行良好,除了...

我的问题是:有些行输入了两次,但有细微的差别。 例如:

       (name, phone, address, subscription number)
ROW 1: "John, Smith, 3232112111, 123 2nd St #4, 5shdm67h5" 
ROW 2: "JOHN, SMITH, 13232112111, 123 Second Street Apt. 4, 5shdm67h5". 

每一行的最后一个值是它们的“订阅号”,它是唯一键。客户显然是相同的,但是这两个条目输入的姓名、电话和地址的值不同。使用 distinct,它为 John Smith 的每一行创建两个客户 ID。

我需要 DISTINCT 仅基于订阅号并完全忽略其他列。每次我尝试时,它只会为输入不匹配的地址、电话号码等的客户插入重复的客户。因此,当插入订单时,它会为每个客户号码创建一个相同订单的列表两次,用于技术上同一个客户。

尝试了 DISTINCT(其中不存在)和 ROW_NUMBER 的几种不同组合,但我得到的客户/订单数有误,或者语法不正确。

【问题讨论】:

  • 请发布您的无效代码,以便我们查看您的尝试。请注意,在您的问题中说“请帮助”是不可接受的。在 SO 上发帖的每个人都需要帮助 - 但任何成员都没有优先权或压力来提供帮助。

标签: sql sql-server insert duplicates distinct


【解决方案1】:
WITH Sales_CTE (SalesPersonID, NumberOfOrders)  
AS  
(  
    SELECT SalesPersonID, NumberOfOrders,ROW_NUMBER() OVER(PARTITION BY SalesPersonID)  NN
    FROM Sales.SalesOrderHeader  
)  
DELETE FROM Sales_CTE WHERE NN > 1

【讨论】:

  • 这是一个很好的答案。我更喜欢 CTE 的 select * 而不是选择特定的列,因为目的是删除 整个 行。
【解决方案2】:

最好提供插入此记录的查询。因为您只需要避免重复的条目。

以及您如何区分这 2 条记录是同一个人还是 2 个不同的人。

如果这是代表subscription number。然后你应该尝试在subscription number的基础上找到不同的记录,并在你的表中填写TOP 1记录

  insert into [newtable] ( col1, col2, col3, col4 )
  select Top 1 col1, col2, col3, col4 from [sourcetable] where [subscription number]=@yourvalue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多