SQL查找两个表之间匹配的大多数行

时间:2016-05-27 06:31:01

标签: sql sql-server count match

我正在使用SQL Server 2012我有两个表,如下所示

Match Table

表1和表2都有许多组,由组列表示。组的名称可能在两个表中都匹配,但可能不匹配。重要的是找到表2中具有最多成员与表1中组成员匹配的成员组。

我首先尝试使用vlookup执行此操作,但问题是vlookup会拉出Group列中具有匹配项的第一个条目,而不是具有最多匹配项的组。在vlookup下面会拉BBB,但正确的结果是CCC。

可能会发生关系。 Table2上可能有多个匹配Table1的组具有相同数量的成员,因此最好的方法是计算匹配数,但是有数千个组,因此排序和筛选具有计数的列并不理想。我需要类似于case语句的内容,如果有MAX(匹配),那么Table1将在派生列BestMatch中显示具有MAX(Match)的组名。如果列可以显示表2中具有MAX的所有组(匹配可能是一个或多个,那么它是最理想的。也许它可以用逗号分隔。

如果没有,如果专栏可以说领带而且我可以寻找领带,那么这是理想的,如果这是最好的选择,当单词tie出现时它会重复除了每个匹配的成员之外我会知道看起来对于匹配哪些帐户以及匹配的帐户的组。

4 个答案:

答案 0 :(得分:1)

我们真的可以用一些预期的输出来帮助澄清这个问题。

但是,如果我理解正确,那么此查询将使您接近所需的结果:

;with cte as
(    SELECT t1a.[group] AS Group1
          , t2a.[Group] AS Group2
          , RANK() OVER(PARTITION BY t1a.[group] 
                            ORDER BY COUNT(t2a.[Group]) DESC) AS MatchRank
       FROM Table1 t1a
       JOIN Table2 t2a
         ON t1a.member = t2a.member
   GROUP BY t1a.[group], t2a.[GRoup])
 SELECT * 
   FROM cte
  WHERE MatchRank=1

查询不识别关系,但会显示任何绑定的结果......

如果您是公用表表达式的新手(; with语句),则有一个有用的描述here

答案 1 :(得分:0)

select  *
from    Table1 t1
    outer apply
    (
        select top 1 t2.[Group]
        from   Table2 t2
        where   t2.Member   = t1.Member
        group by t2.[Group]
        order by count(*) desc
    ) m

答案 2 :(得分:0)

它可能不是最优雅的解决方案,但我认为它可以完成这项工作:

select *
from
    (select t1.[group] as t1group, t1.member, t2.[group] as t2group
     from Table1 t1 inner join Table2 t2 on t1.member = t2.member)a
where member = (select max(t1.member) 
                from Table1 t1 inner join Table2 t2 on t1.member = t2.member)

如果Table2中的2行与Table1中的最大成员匹配,则会显示两个结果

PS:你想要的结果的例子会有所帮助

答案 3 :(得分:0)

计算每个组对的成员匹配并对它们进行排名,以使具有最高匹配计数的组对获得排名#1。找到这些后,您可以从table1和table2中选择相关记录。

select t1.grp, t1.member, t2.grp
from t1
join
(
  select 
    t1.grp as grp1, 
    t2.grp as grp2, 
    rank() over (order by count(*) desc) as rnk
  from t1
  join t2 on t2.member = t1.member
  group by t1.grp, t2.grp
) grps on grps.rnk = 1 and grps.grp1 = t1.grp
left join t2 on t2.grp = grps.grp2 and t2.member = t1.member
order by t1.grp, t1.member, t2.grp;

这会在不同的行中为您提供联系,例如: AAA有四个不同的成员(123,456,789,555),在CCC和DDD都有两场比赛:

grp1   member   grp2
AAA    123      CCC
AAA    123      DDD
AAA    456      CCC
AAA    789
AAA    555      DDD

如果你想要每个grp1一行和一个字符串中所有匹配的grp2的成员,那么你知道SQL Server中需要一些笨拙的STUFF技巧。查找“SQL Server中的GROUP_CONCAT”以查找所需的技术。