【发布时间】:2021-02-01 04:56:53
【问题描述】:
我列出了可能将用户带到网站的不同渠道(自然、搜索引擎优化、在线营销等)。我想找到一种有效的方法来计算来自这些渠道组合的每日活跃用户。每个频道都有自己的表格并跟踪其各自的用户。
表格如下所示,
channel A
date user_id
2020-08-01 A
2020-08-01 B
2020-08-01 C
channel B
date user_id
2020-08-01 C
2020-08-01 D
2020-08-01 G
channel C
date user_id
2020-08-01 A
2020-08-01 C
2020-08-01 F
我想知道以下组合
- 只访问A频道
- 仅访问通道 A 和 B
- 只访问B&C频道
- 只访问B频道
- 等
但是,当频道很多时(我有大约 8 个频道),组合就会很多。我做的大致就是这么简单(这个包括A频道)
SELECT
a.date,
COUNT(DISTINCT IF(b.user_id IS NULL AND c.user_id IS NULL, a.user_id, NULL)) AS dau_a,
COUNT(DISTINCT IF(b.user_id IS NOT NULL AND c.user_id IS NULL, a.user_id, NULL)) AS dau_a_b,
...
FROM a LEFT JOIN b ON a.user_id = b.user_id AND a.date = b.date
LEFT JOIN c ON a.user_id = c.user_id AND a.date = c.date
GROUP BY 1
但当总通道数为 8 时(2 种组合 28 种变体,3 种组合 56 种,4 种组合 70 种,等等),则非常繁琐。
有什么聪明的想法可以解决这个问题吗?我正在考虑使用FULL OUTER JOIN,但似乎无法摆脱它。非常感谢您的回答。
【问题讨论】:
-
期望的结果真的很有帮助。在这种情况下,“每日活跃用户”是什么意思?
-
这将是每个日期访问该网站的唯一用户数,在这种情况下,我想知道来自这些渠道组合的数字。
标签: sql count google-bigquery full-outer-join