【问题标题】:Daily/Weekly/Monthly Active Users in postgresqlpostgresql 中的每日/每周/每月活跃用户
【发布时间】:2021-06-17 19:33:14
【问题描述】:

我有两张桌子:

table1 包含一个唯一用户 ID (user_id) 列表,以及他们登录的每个日期 (date) 的时间戳

table1
-------------------
user_id | date
-------------------
User123 | 22/3/2021
User456 | 23/3/2021
User789 | 23/3/2021
User456 | 24/3/2021
User456 | 25/3/2021
User789 | 30/3/2021

table2 包含日期列表,每个日期注册的用户总数 (cum_registered_users)

table2
----------------------
date      | cum_users
---------------------
22/3/2021 |   1
23/3/2021 |   3
24/3/2021 |   3
25/3/2021 |   4
26/3/2021 |   5
27/3/2021 |   5
28/3/2021 |   5
29/3/2021 |   5
30/3/2021 |   5

我要计算什么:

对于表 2 中的相同日期列表,我想知道当天(每日活跃用户)、7 天内(每周活跃用户)和过去 30 天内(每月活跃用户)登录的不同用户数用户)- 占该日期 cum_users 的百分比

7d 活跃用户的期望输出:

date      | 7d_AU | DAU
---------------------
22/3/2021 |   1   |  100%
23/3/2021 |   3   |  100%
24/3/2021 |   3   |  100%
25/3/2021 |   3   |  75%
26/3/2021 |   3   |  60%
27/3/2021 |   3   |  60%
28/3/2021 |   3   |  60%
29/3/2021 |   3   |  60%
30/3/2021 |   2   |  40%

提前感谢您的任何建议

【问题讨论】:

  • 您的架构不支持查询历史活跃用户。如果您正在查看一年前的 table2 行,则可能没有任何 table1 行的最后登录日期在该日期之前的一个月内,因为所有这些用户从那以后都再次登录,所以该数据已丢失。
  • 请提供样本数据和期望的输出
  • @BlueStar 感谢您的评论-您说的很对。我已经更新了上面帖子中的架构 - 这是否允许我们继续?
  • @eshirvana 感谢您的评论 - 如果您能提供帮助,我已经在上面的帖子中添加了更多详细信息?

标签: postgresql


【解决方案1】:

这有点尴尬,但是您可以通过在选择中添加辅助过滤器来将这两个时间跨度都放入一个查询中:

SELECT 
  table2.date,
  cum_users,
  COUNT(DISTINCT table1.user_id) 
    FILTER (WHERE table1.date > table2.date - interval '7 days') 
    AS weekly_active_users,
  (100.0 * 
    COUNT(DISTINCT table1.user_id) 
    FILTER (WHERE table1.date > table2.date - interval '7 days') / cum_users
  )::int::text || '%' AS weekly_active_users_percent,
  COUNT(DISTINCT table1.user_id) AS monthly_active_users,
  (100.0 * 
    COUNT(DISTINCT table1.user_id) / cum_users
  )::int::text || '%' AS monthly_active_users_percent
FROM table2
JOIN table1 ON (table1.date <= table2.date AND table1.date > table2.date - interval '30 days')
GROUP BY table2.date, table2.cum_users
ORDER BY table2.date;

【讨论】:

  • 太棒了 - 谢谢!所以我认为它在我的数据集中效果很好,我唯一的问题是——这里的间隔应该是 6 天,因为我们正在做 =(即,或者我们用 做 7 天的间隔)。因此,我们也会为 30 天滚动执行 29 天。有没有一种简单的方法可以将 30d 添加到同一个报告中?
  • @Ross 我编辑了我的答案,将两个时间跨度包含在同一个查询中。是的,其中一种不平等不应该是包容性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多