【发布时间】:2015-04-02 14:01:24
【问题描述】:
假设我有一个像这样的 DATA 表:
ID | Col1 | Col2 | Col3
1 a b 23
2 a c 14
3 f g 11
假设我有一个 POSSIBLE_MATCHES 表,例如:
MatchID | Col1 | Col2 | Col3
101 a a 11
102 a b 11
103 a b 14
104 a c 23
105 f a 1
假设我有一个 WEIGHTS 表,例如(如果你想为了讨论和简单起见假设所有权重为 1 - 我可以稍后即兴解决我的解决方案以合并权重):
Col | Weight
Col1 1
Col2 1.5
Col3 2
因此,对于每个可能的匹配,我们将在每个匹配列上计算一个 SCORE。
Score = Col1 Weight * (CASE WHEN DATA.COL1 = POSSIBLE_MATCHES.Col1 THEN 1 ELSE 0) +
Col2 Weight * (CASE WHEN DATA.COL2 = POSSIBLE_MATCHES.Col2 THEN 1 ELSE 0) +
Col3 Weight * (CASE WHEN DATA.COL3 = POSSIBLE_MATCHES.Col3 THEN 1 ELSE 0)
例如,第一行的 BEST MATCH:Col1 = a, Col2 = b, Col3 = 23:
MatchID | Col1 | Col2 | Col3 | Score
101 a a 11 1*1 + 1.5*0 + 2*0 = 1
102 a b 11 1*1 + 1.5*1 + 2*0 = 2.5
103 a b 14 1*1 + 1.5*1 + 2*0 = 2.5
104 a c 23 1*1 + 1.5*0 + 2*1 = 3
105 f a 1 1*0 + 1.5*0 + 2*0 = 0
所以在这种情况下,ID:1 的最佳匹配是 MatchID:104。如果分数相同,则取最低的 MatchID。
如果你想玩这个,这里有一个 sql fiddle: http://sqlfiddle.com/#!6/9df45/1
对于 DATA 中的每个 ID,我如何在 POSSIBLE MATCHES 中找到最佳匹配?
【问题讨论】:
-
Best Match 是得分最高的 MatchID
-
所以解决方案是正确加入表格,评估分数并选择得分最高的匹配项。你到底卡在哪里了?
-
@ThorstenKettner:是的。只需要一些关于如何做这样的事情的指导。
-
除了粗体(真的,跳过粗体),这个最新的编辑使这是一个很好的问题。
标签: sql sql-server