【问题标题】:Find 'Most Similar' Items in Table by Foreign Key按外键查找表中“最相似”的项目
【发布时间】:2016-09-13 22:27:49
【问题描述】:

我有一个子表,其中包含给定“材料”(MaterialID) 的多个字符/值对。任何材料都可以有多个字符值,并且可能有多个相同的名称(参见 id 的 2,3)。

该表有大量记录(8+ 百万)。我要做的是找到与提供的材料最相似的材料。也就是说,当我提供 MaterialID 时,我想要一个最相似的其他材料(具有最匹配的字符/值对的材料)的有序列表。

我已经进行了一些研究,但是我可能遗漏了一些关键术语,或者只是没有正确地概念化问题。

非常感谢任何有关如何进行此操作的提示。

ID  MaterialID  Charact             Value
1   1           ROT_DIR             CCW
2   1           SPECIAL_FEATURE     CATALOG_CP
3   1           SPECIAL_FEATURE     CHROME
4   1           SCHEDULE            80
5   2           BEARING_TYPE        SB
6   2           SCHEDULE            80
7   3           ROT_DIR             CCW
8   3           SPECIAL_FEATURE     CATALOG_HSB
9   3           BEARING_TYPE        SP
10  4           NDE_STYLE           W_FAN
11  4           BEARING_TYPE        SB
12  4           ROT_DIR             CW*

【问题讨论】:

  • 你想要那个1 | ROT_DIR | CCW 正上方 3 | ROT_DIR | CCW ?或者你想要的结果是什么?
  • 结果将是与我提供的 MaterialID 最相似的 MaterialID 列表。那是;如果我提供 MaterialID = 1,结果将是最匹配 MaterialID = 1 的字符/值对的其他 MaterialID 的有序列表

标签: sql tsql sql-server-2012


【解决方案1】:

您可以通过自加入来做到这一点:

select t.materialid, count(*) as nummatches
from t join
     t tmat
     on t.Charact = tmat.Charact and t.value = tmat.value
where tmat.materialid = @MaterialId
group by t.materialid
order by nummatches desc;

注意事项:

  • 您可能希望通过将where t.MaterialId <> tmat.MaterialId 添加到where 子句来删除指定的材料。
  • 如果您想要所有材料,则将连接设为left join,并将where 条件移至on 子句。
  • 如果您只想要一种匹配最多的材料,请使用select top 1
  • 如果您希望所有材料在有关联时匹配最多,请使用 `select top (1) with ties。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2016-03-14
    • 2021-08-24
    • 2019-01-03
    相关资源
    最近更新 更多