我的头骨已经开裂了,但它很有趣。我有一个表,其中每一行代表一个应用程序启动事件,从几个不同的应用程序记录。我正在使用Redshift数据库,因此使用Redshift的Postgresql实现。
此表格中的每一行都包含以下列:
我需要计算这个比率:
这意味着,我不会像日历月(1月,2月,3月等)那样寻找每月活跃用户。
我需要计算该ISO周中不同的活跃用户除以该周内的活跃用户及其前三周(因此MAU基本上是过去四个四周活跃用户)。
现在,我有查询来获取每周活跃用户,如下所示。周代表为“周数 - 年”。
select app_id, TO_CHAR(date,'IW-IYYY') Week, count (distinct client_id) ClientsInWeek
from weplay_singtel.gamelaunch t1
where app_id <> 1751
group by app_id, Week
order by app_id, TO_DATE(TO_CHAR(date,'IW-IYYY'),'IW-IYYY');
其中提供的数据如下面的屏幕截图所示: 正如您所看到的,对于每个ISO周和年,我有不同客户的数量。
为了让那个和前三个星期的活跃用户在一起,我最初使用了一个滞后,并从上面的数据中总结了每周的3个每周计数。然而,这笔款项实际上并没有给我不同的用户,它只是每周不同客户的总和。如果同一个用户在第1周打开一个应用程序,然后在第2周再打开一个应用程序,他将在此方法中计算两次,这是不可接受的!
我需要四周移动窗口中的独特客户。我怀疑我需要使用以某种方式移动一周的分区,但我似乎无法编写或可视化此查询。
发布此信息时,我还需要同样创建比率:从当天起的最近30天内,每日活跃用户数/不同活跃用户数。
任何指导都会非常有用。可以使用移动分区来完成吗?或者使用Cross Apply(在Postgresql Lateral中)?
希望这是有道理的!如果有任何不清楚的地方请询问,我会立即回复更多信息。在此先感谢大家。
答案 0 :(得分:0)
这会计算不同查询中的不同客户端并加入它们:
with t as (
select *
from weplay_singtel.gamelaunch
where app_id <> 1751
)
with w as (
select
app_id,
date_trunc('week', "date") as Week,
count (distinct client_id) as ClientsInWeek
from t
group by app_id, 2
), w4 as (
select
app_id,
daterange(
date_trunc('week', "date" - interval '4 weeks'),
date_trunc('week', "date"),
'[]'
) as w4,
count (distinct client_id) as ClientsInW4
from t
group by app_id, 2
)
select
w.app_id, week, clientsinweek, clientsinw4,
clientsinweek::float / clientsinw4
from
w
inner join
w4 on
week = upper(w4)
and
w.app_id = w4.app_id
将4周时段分组为日期范围。现在发布数据,我可以测试它。