3

一直在为此绞尽脑汁,不过这很有趣。我有一个表,其中每一行代表一个应用程序启动事件,从几个不同的应用程序记录。我正在使用 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 横向)?

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

4

1 回答 1

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 周期间被分组为一个日期范围。现在发布数据,我可以测试它。

于 2014-07-01T11:09:13.400 回答