2016-09-13 2 views
0

У меня есть дочерняя таблица с несколькими парами символов/значений для данного «материала» (MaterialID). Любой материал может иметь несколько значений charact и может иметь несколько одинаковых имен (см. 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* 
+0

Вы хотите, чтобы '1' | 'ROT_DIR' | 'CCW' находится прямо над' 3' | 'ROT_DIR' | 'CCW'? Или какой результат вы хотите иметь? – Nebi

+0

Результатом будет список MaterialID, который больше всего похож на MaterialID, который я поставляю. То есть; если я поставлю MaterialID = 1, результаты будут упорядоченным списком других MaterialID, которые наиболее соответствуют парам Charact/Value MaterialID = 1 – beeker

ответ

2

Вы можете сделать это с автообъединением:

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) со связями.
+0

Это отлично работает для меня, спасибо большое! – beeker

Смежные вопросы