用于计算用户的常用项的SQL查询

时间:2012-07-14 10:31:22

标签: sql oracle count oracle10g

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

1 个答案:

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

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