如何从 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 joingroup 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;

&lt;n - 1&gt; 比天数少一。所以一周,它会是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 中的活动日志计算“活动用户”聚合?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取活动用户的 SID

聚合支付系统设计

聚合支付系统设计

聚合支付系统设计

如何从事件日志表计算 SQL Server 中的平均队列长度

当我们从另一个活动返回时如何刷新活动的数据?