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