如何使用移动窗口/分区或任何其他方法获得不同的每周活跃用户/不同的每月活跃用户?

时间:2014-07-01 09:48:09

标签: sql postgresql amazon-redshift partition active-users

我的头骨已经开裂了,但它很有趣。我有一个表,其中每一行代表一个应用程序启动事件,从几个不同的应用程序记录。我正在使用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');

其中提供的数据如下面的屏幕截图所示:Weekly Active Users Screenshot 正如您所看到的,对于每个ISO周和年,我有不同客户的数量。

为了让那个和前三个星期的活跃用户在一起,我最初使用了一个滞后,并从上面的数据中总结了每周的3个每周计数。然而,这笔款项实际上并没有给我不同的用户,它只是每周不同客户的总和。如果同一个用户在第1周打开一个应用程序,然后在第2周再打开一个应用程序,他将在此方法中计算两次,这是不可接受的!

我需要四周移动窗口中的独特客户。我怀疑我需要使用以某种方式移动一周的分区,但我似乎无法编写或可视化此查询。

发布此信息时,我还需要同样创建比率:从当天起的最近30天内,每日活跃用户数/不同活跃用户数。

任何指导都会非常有用。可以使用移动分区来完成吗?或者使用Cross Apply(在Postgresql Lateral中)?

希望这是有道理的!如果有任何不清楚的地方请询问,我会立即回复更多信息。在此先感谢大家。

1 个答案:

答案 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周时段分组为日期范围。现在发布数据,我可以测试它。