私のソリューションは、関心のあるすべての可能なアプリケーションのペアを生成することから始まります。これがdriver
サブクエリです。
次に、各アプリの元のデータに結合します。
最後にcount(distinct)
、2 つのリスト間で一致する個別のユーザーをカウントするために使用します。
select pairs.app1, pairs.app2,
COUNT(distinct case when tleft.user = tright.user then tleft.user end) as NumCommonUsers
from (select t1.app as app1, t2.app as app2
from (select distinct app
from t
) t1 cross join
(select distinct app
from t
) t2
where t1.app <= t2.app
) pairs left outer join
t tleft
on tleft.app = pairs.app1 left outer join
t tright
on tright.app = pairs.app2
group by pairs.app1, pairs.app2
の条件付き比較をcount
結合に移動して、次を使用できますcount(distinct)
。
select pairs.app1, pairs.app2,
COUNT(distinct tleft.user) as NumCommonUsers
from (select t1.app as app1, t2.app as app2
from (select distinct app
from t
) t1 cross join
(select distinct app
from t
) t2
where t1.app <= t2.app
) pairs left outer join
t tleft
on tleft.app = pairs.app1 left outer join
t tright
on tright.app = pairs.app2 and
tright.user = tleft.user
group by pairs.app1, pairs.app2
私は最初の方法を好みます。これは、何をカウントするかがより明確になるためです。
これは標準 SQL であるため、Vertica で動作するはずです。