如何从 SQL 中的活动日志计算“活动用户”聚合?
Posted
技术标签:
【中文标题】如何从 SQL 中的活动日志计算“活动用户”聚合?【英文标题】:How can I calculate an "active users" aggregation from an activity log in SQL? 【发布时间】:2021-02-22 12:31:31 【问题描述】:在 PostgreSQL 中,我有一个记录所有用户活动的表,其中包含一个帐户 ID 和一个时间戳字段:
SELECT account_id, created FROM activity_log;
一个account_id
一天可以出现多次,或者根本不出现。
我想要一张显示每天“活跃用户”数量的图表,其中“活跃用户” 表示“在过去 X 天内进行过任何活动的用户”。
如果 X 为 1,那么我们可以将时间戳截断为 'day' 并聚合:
SELECT date_trunc('day', created) AS date, count(DISTINCT account_id)
FROM activity_log
GROUP BY date_trunc('day', created) ORDER BY date;
如果 X 正好是 7,那么我们可以截断为 'week' 并聚合 - 尽管这给出了 我一周只需要一个数据点,而我实际上每天需要一个数据点。
但我需要解决不同 X 的一般情况,并为每一天提供一个不同的数据点。
【问题讨论】:
【参考方案1】:一种方法是生成日期,然后使用left join
和group by
或类似逻辑进行计数。以下使用横向连接:
select gs.dte, al.num_accounts
from generate_series('2021-01-01'::date, '2021-01-31'::date, interval '1 day'
) gs(dte) left join lateral
(select count(distinct al.account_id) as num_accounts
from activity_log al
where al.created >= gs.dte - (<n - 1>) * interval '1 day' and
al.created < gs.dte + interval '1 day'
) al
on 1=1
order by gs.dte;
<n - 1>
比天数少一。所以一周,它会是6
。
【讨论】:
【参考方案2】:如果您的目标是获取过去 X 天的每日不同 account_id,您可以使用以下查询。除了 7,您可以根据需要使用任何数字:
SELECT date_trunc('day', created) AS date, count(DISTINCT account_id)
FROM activity_log
where date_trunc('day', created)>=date_trunc('day',CURRENT_DATE) +interval '-7' day
GROUP BY date_trunc('day', created)
ORDER BY date
(如果在任何给定日期都没有活动,则该日期不会出现在输出中。)
【讨论】:
以上是关于如何从 SQL 中的活动日志计算“活动用户”聚合?的主要内容,如果未能解决你的问题,请参考以下文章