如何从SQL中的活动日志计算“活动用户”聚合?

如何从SQL中的活动日志计算“活动用户”聚合?,sql,postgresql,Sql,Postgresql,在PostgreSQL中,我有一个记录所有用户活动的表,其中有一个帐户ID和一个时间戳字段: 选择从活动日志创建的帐户id; 一个帐户id可能在一天内出现多次,或者根本不出现 我想要一个图表,显示每天活动用户的数量,其中活动用户 指在前X天内完成任何活动的用户 如果X为1,则我们可以将时间戳截断为“天”,并聚合: 选择日期,创建为日期,countDISTINCT account id 从活动日志 按日期分组,按日期创建订单; 如果X正好是7,那么我们可以将其截断为“week”并进行聚合-尽管这会

在PostgreSQL中,我有一个记录所有用户活动的表,其中有一个帐户ID和一个时间戳字段:

选择从活动日志创建的帐户id; 一个帐户id可能在一天内出现多次,或者根本不出现

我想要一个图表,显示每天活动用户的数量,其中活动用户 指在前X天内完成任何活动的用户

如果X为1,则我们可以将时间戳截断为“天”,并聚合:

选择日期,创建为日期,countDISTINCT account id 从活动日志 按日期分组,按日期创建订单; 如果X正好是7,那么我们可以将其截断为“week”并进行聚合-尽管这会给出 我一周只需要一个数据点,而实际上我每天需要一个数据点


但我需要解决不同X的一般情况,并为每天提供不同的数据点。

一种方法是生成日期,然后使用左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;

比天数少一天。因此,如果您的目标是获得过去X天内的逐日不同帐户id,则一周内的时间为6。

您可以在下面的查询中使用。您可以使用任意数字代替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
如果在任何给定日期没有活动,则该日期将不在输出中