У меня были данные, как показано ниже:
CustomerId Category
100 2
100 2
100 3
100 6
100 4
200 3
200 6
200 7
300 2
Итак, мне нужен индекс подобия Jaccard:
- Жаккард (100 200) = 2 (общие предметы) / 5 (объединение предметов)
- Jaccard(100 300) = 1 (общие предметы) / 4 (объединение предметов)
- Jaccard(200,300) = 0 (общие предметы) / 4 (объединение предметов).
Сначала я пытался найти союз и пересечение терминов, но я не уверен, что это самый эффективный способ. Также я хочу, чтобы дубликаты, такие как Jaccard (100 300) и Jaccard (300 100), не появлялись вместе. Может ли кто-нибудь помочь с этим?
select t1.customer_id, t2.customer_id,
sum(case when t1.category_id = t2.category_id then 1 else 0 end) intersection,
sum(case when t1.category = t2.category then 1
when t1.category <> t2.category then 1 else 0 end)
union
from t t1 cross join
t t2
Where t1.customer_id <> t2.customer_id
group by t1.customer_id, t2.customer_id
К сожалению, я также проверил, что у меня есть один клиент, покупающий несколько товаров в одной категории. Поэтому я отредактировал таблицу, чтобы отразить, что у клиента 100 есть два товара в категории 2. Однако это не должно изменить значения метрики сходства Jaccard.
cross join
.. он должен работать 24.05.2017