一直在为此绞尽脑汁,不过这很有趣。我有一个表,其中每一行代表一个应用程序启动事件,从几个不同的应用程序记录。我正在使用 Redshift 数据库,因此使用 Redshift 的 Postgresql 实现。
此表中的每一行都有以下列:
- 应用程序 ID (app_id)
- 标识用户的 client_id
- SQL 日期格式的日期(创造性地命名的日期)
我需要计算这个比率:
- (每周不同的活跃用户)/(与本周不同的活跃用户并且是前三周)
这意味着,我不会像日历月份(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 周和年,我有不同客户的数量。
为了将那一周的活跃用户和前三周的活跃用户放在一起,我最初使用 Lag 并根据上述数据对每周的前 3 周计数求和。然而,这个总和实际上并没有给我不同的用户,它只是每周不同客户的总和。如果同一个用户在第 1 周打开一个应用,然后在第 2 周再次打开,这种方法会被计算两次,这是不可接受的!
我需要在四个星期的移动窗口中找到不同的客户。我怀疑我需要使用以某种方式移动一周以上的分区,但我似乎无法编写或可视化此查询。
发布此消息后,我同样需要创建比率:从那天起的最近 30 天内不同的每日活跃用户数/不同的活跃用户数。
任何指导都会非常有帮助。这可以使用移动分区来完成吗?还是使用交叉应用(在 Postgresql 横向)?
希望这是有道理的!如果有任何不清楚的地方,请询问,我会立即回复更多信息。先谢谢各位了。