Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如何在两列/条件上消除重复?_Sql_Sql Server_Tsql_Where Clause_Greatest N Per Group - Fatal编程技术网

SQL Server:如何在两列/条件上消除重复?

SQL Server:如何在两列/条件上消除重复?,sql,sql-server,tsql,where-clause,greatest-n-per-group,Sql,Sql Server,Tsql,Where Clause,Greatest N Per Group,我有一个数据库表,其中包含重复的地址行。对于重复的地址行,我希望从一列中保留一个值最高的行,如果仍然存在重复的地址行,则只需选择一个(没关系,因为这些是任意字符串值,无法知道哪一个更好,max/min就足够了)。例如,假设下表有两个地址,其中一个地址重复了四次: ADDR1 CITY STATE APN CONFIDENCE 1 Main St. Dover IL apn-1 7 1 Main St. Dover IL apn-2

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

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实例也很少——如果我可以优化上述内容或使用另一种更有效的方法,我不想使其过载。

您可以使用窗口函数:

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

另一种选择是使用带领带的

不清楚订单中是否需要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

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