【发布时间】: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 实例很少——如果出现以下情况,我不想重载它我可以优化上述方法或使用其他更有效的方法。
【问题讨论】:
标签: sql sql-server tsql where-clause greatest-n-per-group