SQL Server:如何对两列/条件进行重复数据删除?

Posted

技术标签:

【中文标题】SQL Server:如何对两列/条件进行重复数据删除?【英文标题】:SQL Server: How to de-duplicate on two columns/conditions? 【发布时间】:2021-01-15 11:19:33 【问题描述】:

我有一个包含重复地址行的数据库表。对于重复的地址行,我想保留一列中具有最高值的单行,并且在仍然存在重复的情况下,只需选择一个(没关系,无法知道哪个更好,因为这些是任意字符串值,最大值/最小值就足够了)。例如,假设我们有一个包含两个地址的表,其中一个地址重复了四次:

ADDR1       CITY    STATE   APN     CONFIDENCE
1 Main St.  Dover   IL      apn-1   7
1 Main St.  Dover   IL      apn-2   8
1 Main St.  Dover   IL      apn-3   5
1 Main St.  Dover   IL      apn-4   8
7 Ajax Rd.  Dover   IL      apn-8   9

我需要在地址列上使用 group by 过滤出重复的行,只筛选出地址置信度得分最高的行,然后从该“子选择”中选择未分组列的最大值或最小值(在此示例中为APN)以获得以下所需结果:

ADDR1       CITY    STATE   APN     CONFIDENCE
1 Main St.  Dover   IL      apn-4   8
7 Ajax Rd.  Dover   IL      apn-8   9

我想出了一个有效的 SQL 查询:

select sub.ADDR1, sub.CITY, sub.STATE, MAX(APN), sub.CONFIDENCE
from example_db.example_table as table1
left join (
    select ADDR1,
           CITY,
           STATE,
           MAX(CONFIDENCE) as CONFIDENCE
    from example_db.example_table
    group by ADDR1,
             CITY,
             STATE
) as sub
on (table1.ADDR1 = sub.ADDR1)
and (table1.CITY = sub.CITY)
and (table1.STATE = sub.STATE)
group by sub.ADDR1, sub.CITY, sub.STATE, sub.CONFIDENCE

以上是演示我的用例的简化示例,但我将运行此 SQL 代码的数据很大(约 1.3 亿行)并且 SQL Server 实例很少——如果出现以下情况,我不想重载它我可以优化上述方法或使用其他更有效的方法。

【问题讨论】:

【参考方案1】:

你可以使用窗口函数:

select *
from (
    select t.*, 
        row_number() over(partition by addr1, city, state order by confidence desc) rn
    from mytable t
) t
where rn = 1

【讨论】:

【参考方案2】:

另一种选择是使用WITH TIES

不完全清楚订单中是否需要 APN

示例

Select top 1 with ties * 
 From  YourTable
 Order by row_number() over (partition by addr1,city,state order by confidence desc, apn)

退货

 ADDR1      CITY    STATE     APN     CONFIDENCE
1 Main St.  Dover   IL        apn-2   8
7 Ajax Rd.  Dover   IL        apn-8   9

【讨论】:

非常漂亮的方法!我喜欢它:-)

以上是关于SQL Server:如何对两列/条件进行重复数据删除?的主要内容,如果未能解决你的问题,请参考以下文章

对两列数据进行排序并保留不重复的值

选择对两列求和并希望将结果用作选择条件的查询 [重复]

SQL使用group by获取SUM,但有条件地对两列之一的内容求和

熊猫:对两列一起排序[重复]

CreateCriteria 对两列组合进行排序

如何对两列求和并通过减去它们的聚合 SQL 和 C# 在第三列中显示结果?