【问题标题】:How can I calculate an "active users" aggregation from an activity log in SQL?如何从 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 的一般情况,并为每一天提供一个不同的数据点。

【问题讨论】:

    标签: sql postgresql


    【解决方案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
      

      (如果在任何给定日期都没有活动,则该日期不会出现在输出中。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多