如果我只有 userId,那么计算留存率的最佳方法是什么?

What's the best way to calculate retention if all I have is userIds?

我刚开始学习SQL,面临以下问题:

我有一个网站,每月都有注册客户访问它。没有任何类型的订阅,所以我只有一个 table 来收集我客户的 activity(用户 ID、操作、时间戳)的事件。

我可以很容易地检查我在 1 月和 2 月有多少唯一 (DISTINCT userId),但我想了解的是 - 有多少用户在 1 月处于活跃状态(如他们在 table) 二月份还在使用这个网站吗?所以它就像一个搅动,但我无法理解这里最好的方法是什么。

我想到的可能的解决方案:

  1. 获取 1 月份的用户 ID 列表:
SELECT DISTINCT user_id
FROM site_activity
WHERE time_utc BETWEEN '2022/01/01' AND '2022/01/31'
  1. 获取 2 月的用户 ID 列表
SELECT DISTINCT user_id
FROM site_activity
WHERE time_utc BETWEEN '2022/02/01' AND '2022/02/28'
  1. 以某种方式检查重叠,并将 1 月存在的每个 2 月用户标记为“保留”table,并将其他任何人标记为“新”或“正在恢复”(也许他们在去年 12 月活跃)。
And here I thought of writing something with WHILE?

我走的路对吗?

如果你的任务只有两个月(一月和二月),那么你可以使用简单的JOIN,像这样:

WITH
    t AS (SELECT user_id,
                 EXTRACT(MONTH FROM time_utc) AS month
              FROM site_activity
              GROUP BY user_id, EXTRACT(MONTH FROM time_utc))
SELECT t.user_id,
       t.month,
       CASE WHEN t2.user_id IS NULL THEN 'new' ELSE 'retained' END AS status
    FROM t
    LEFT JOIN t AS t2
            ON t.user_id = t2.user_id
            AND t.month = 2 -- take Feb users
            AND t2.month = 1 -- join Jan users
    ORDER BY t.user_id, t.month;

在这里你可以看到用户 1 在 1 月份是 'new' 但在 2 月份将成为 'retained'。用户 2 和 3 在 1 月份没有记录,所以他们是 'new' 二月

这里还有dbfiddle

如果不参考月份需要做,再问我,我可以修改我的代码(或者你自己做,以此为基础)。无论如何,我想看一个预期结果的例子。

upd. 有 PG 语法,因此您可能需要更改一些结构(如 EXTRACT)以更正一个。或者指定您的数据库,我也会修复它