我正在使用 SQL Server 2012 我有两个表,如下所示
表 1 和表 2 都有很多组,用组列表示。两个表中的组名可能匹配,但也可能不匹配。重要的是在表 2 中找到与表 1 上的组中的成员匹配的成员最多的组。
我首先尝试使用 vlookup 执行此操作,但问题是 vlookup 会提取 Group 列中匹配的第一个条目,而不是匹配最多的组。在 vlookup 下面会拉 BBB,但正确的结果是 CCC。
可能会发生关系。 Table2 上可能有多个组将 Table1 与相同数量的成员匹配,因此最好的方法可能是计算匹配的数量,但有数千个组,因此对具有计数的列进行排序和筛选并不理想.我需要一个 case 语句,如果有 MAX(match),那么 Table1 将在派生列 BestMatch 中显示带有 MAX(Match) 的组名。如果该列可以显示表 2 上具有 MAX(Match 可能是一个或多个。也许可以用逗号分隔的所有组),那将是最理想的。
如果不是,如果专栏可以只说领带,我可以寻找领带,如果这是最好的选择,那将是理想的,当领带这个词出现时,除了每个匹配的成员之外,它还会重复,这样我就会知道寻找那些匹配哪些帐户以及匹配的帐户数量。
最佳答案
我们真的可以用一些预期的输出来帮助澄清这个问题。
但是,如果我理解正确,此查询将使您接近所需的结果:
;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 .
关于SQL 查找在两个表之间匹配的大多数行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37476340/