0

テーブルが1つあり、ユーザーAとユーザーBの2人のユーザーがいると仮定します。ユーザーAとユーザーBにはいくつかのアイテムがあります。これらのアイテムのいくつかは同じですが、いくつかは異なります。共通点がいくつあるかを数えたい。

たとえば、ユーザーAとユーザーBには2つの共通のアイテムがあります。ユーザーAとユーザーCには、共通のアイテムが1つだけあります。ユーザー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フィドルです。

itemこれは同一であるかどうかを知りたい列であるため、結合が実行されます。ユーザーが同じ場所は除外しましたが、必要に応じて含めることができます。

最も重要な部分はa.username < b.usernameです。これを使用しない場合は、ユーザー名が逆になっている2つの同じ行が表示されます。たとえば、とを取得A|B|2B|A|2ます。

私も使用しdistinct itemました。個別の数ではなくアイテムの数が必要な場合は、このキーワードを削除するだけです。

于 2012-07-14T11:12:00.010 に答える