我有一个表,假设有2个用户,用户A和用户B.用户A和用户B有一些项目;其中一些项目是相同的,但其中一些是不同的。我想要计算他们有多少共同的项目。
例如,用户A和用户B有2个常用项。用户A和用户C只有一个共同项。用户B和用户C有2个常用项目等。
如何在SQL中执行此操作?
Users Items
A C1
A C2
A C3
B C2
B C3
B C4
B C5
C C1
C C4
C C5
C C6
这是我到目前为止所尝试的:
select distinct users, count(items) over (partition by items)
from table1
答案 0 :(得分:4)
好的,这可以通过自我加入来完成:
select a.username as user1
, b.username as user2
, count(distinct a.item) as similar
from user_items a
join user_items b
on a.item = b.item
where a.username <> b.username
and a.username < b.username
group by a.username, b.username
这是一个SQL Fiddle来演示。
联接在item
上完成,因为这是您想要知道的列是否相同。我已经排除了用户相同的位置,但如果需要,可以包含它。
最重要的部分是a.username < b.username
。如果你不使用它,那么你得到两个相同的行,用户名是反向的。例如,您获得A|B|2
和B|A|2
。
我也使用了distinct item
。如果您想要项目数而不是不同数量,只需删除此关键字。