SQL Server : How to de-duplicate on two columns/conditions?

标签 sql sql-server t-sql where-clause greatest-n-per-group

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

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

我需要在地址列上使用分组依据,将重复行过滤为仅那些具有最高置信度分数的行,然后从该“子选择”中选择未分组列的最大值或最小值(本例中为 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 代码的数据很大(约 130M 行),并且 SQL Server 实例很小 - 如果出现以下情况,我不想使其过载我可以优化上述内容或使用另一种更有效的方法。

最佳答案

您可以使用窗口函数:

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

关于SQL Server : How to de-duplicate on two columns/conditions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64126503/

相关文章:

sql-server - SqlBulkCopy 和 SQL 注入(inject)防护

sql-server - SQL 中的二元运算符 OR?

sql - 如何使用 Ruby 和 SQLite3 从数据库中选择一个值?

MySQL-删除相关表行

sql - 在 MDX 查询上添加过滤器

c# - 如何在 ASP.NET Identity (WebForms) 中使用我自己的数据库

sql-server - 从字符串转换日期和/或时间时 SQL Server 错误转换失败

mysql - 按子组排序

sql - T-SQL:检查给定日期是否采用夏令时

azure - 我需要在特定版本的 Delta 表之上创建一个 View 。有没有办法在 Synapse 中并使用 T-SQL 来完成此操作?