0

我有一张表,假设有 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
4

1 回答 1

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|2B|A|2

我也用过distinct item。如果您想要项目的数量而不是不同的数量,只需删除此关键字。

于 2012-07-14T11:12:00.010 回答