SQL 查询用户重新激活
SQL query for user reactivations
我正在尝试构建一个查询来计算每月的用户重新激活,其中“重新激活”定义为(例如 2021 年 3 月):
- 2021 年 1 月期间或之前activity发送
- 2021 年 2 月未发送 activity
- 2021 年 3 月 activity 发送
(因此 1 个或多个完整日历月没有 activity 作为不活动的阈值)。
源 table F_ACTIVITY 是每个用户每天的时间序列,包含以下列:
dt(日期),user_id,is_active(布尔值)。
期望的结果是 table 显示:
月,reactivations_this_month
我能得到的最接近的是当月的重新激活计数,或者相对于当前日期的更多案例陈述(例如,当月 -2 重复):
SELECT
COUNT(*) AS reactivations_this_month
FROM
(SELECT
* FROM
(SELECT
user_id,
SUM(current_month_active) AS cma,
SUM(last_month_active) AS lma,
SUM(historical_active) AS h_a
FROM
(SELECT
user_id,
dt,
CASE WHEN DATE_TRUNC(MONTH, DT) = ADD_MONTHS(DATE_TRUNC(MONTH, CURRENT_TIMESTAMP), 0) THEN 1 ELSE 0 END AS current_month_active,
CASE WHEN DATE_TRUNC(MONTH, DT) = ADD_MONTHS(DATE_TRUNC(MONTH, CURRENT_TIMESTAMP), -1) THEN 1 ELSE 0 END AS last_month_active,
CASE WHEN DATE_TRUNC(MONTH, DT) < ADD_MONTHS(DATE_TRUNC(MONTH, CURRENT_TIMESTAMP), -1) THEN 1 ELSE 0 END AS historical_active
FROM F_ACTIVITY
WHERE is_active = 1
) AS x
GROUP BY user_id) AS y
WHERE cma > 0
AND lma = 0
AND h_a > 0) AS z
非常感谢任何帮助将其转换为每月滚动查询的帮助 - 谢谢大家!
最后说明:我在 Snowflake 中尝试这个,所以方言是 SnowSQL
先按月份和用户汇总,再用lag()
:
SELECT yyyymm,
SUM(CASE WHEN prev_yyyymm < yyyymm - INTERVAL '1 month' THEN 1 ELSE 0 END) as num_reactivations
FROM (SELECT user_id, DATE_TRUNC(MONTH, DT) as yyyymm,
LAG(DATE_TRUNC(MONTH, DT)) OVER (PARTITION BY user_id ORDER BY DATE_TRUNC(MONTH, DT)) as prev_yyyymm
FROM F_ACTIVITY
WHERE is_active = 1
GROUP BY user_id, DATE_TRUNC(MONTH, DT)
) um
GROUP BY yyyymm;
我正在尝试构建一个查询来计算每月的用户重新激活,其中“重新激活”定义为(例如 2021 年 3 月):
- 2021 年 1 月期间或之前activity发送
- 2021 年 2 月未发送 activity
- 2021 年 3 月 activity 发送
(因此 1 个或多个完整日历月没有 activity 作为不活动的阈值)。
源 table F_ACTIVITY 是每个用户每天的时间序列,包含以下列:
dt(日期),user_id,is_active(布尔值)。
期望的结果是 table 显示:
月,reactivations_this_month
我能得到的最接近的是当月的重新激活计数,或者相对于当前日期的更多案例陈述(例如,当月 -2 重复):
SELECT
COUNT(*) AS reactivations_this_month
FROM
(SELECT
* FROM
(SELECT
user_id,
SUM(current_month_active) AS cma,
SUM(last_month_active) AS lma,
SUM(historical_active) AS h_a
FROM
(SELECT
user_id,
dt,
CASE WHEN DATE_TRUNC(MONTH, DT) = ADD_MONTHS(DATE_TRUNC(MONTH, CURRENT_TIMESTAMP), 0) THEN 1 ELSE 0 END AS current_month_active,
CASE WHEN DATE_TRUNC(MONTH, DT) = ADD_MONTHS(DATE_TRUNC(MONTH, CURRENT_TIMESTAMP), -1) THEN 1 ELSE 0 END AS last_month_active,
CASE WHEN DATE_TRUNC(MONTH, DT) < ADD_MONTHS(DATE_TRUNC(MONTH, CURRENT_TIMESTAMP), -1) THEN 1 ELSE 0 END AS historical_active
FROM F_ACTIVITY
WHERE is_active = 1
) AS x
GROUP BY user_id) AS y
WHERE cma > 0
AND lma = 0
AND h_a > 0) AS z
非常感谢任何帮助将其转换为每月滚动查询的帮助 - 谢谢大家!
最后说明:我在 Snowflake 中尝试这个,所以方言是 SnowSQL
先按月份和用户汇总,再用lag()
:
SELECT yyyymm,
SUM(CASE WHEN prev_yyyymm < yyyymm - INTERVAL '1 month' THEN 1 ELSE 0 END) as num_reactivations
FROM (SELECT user_id, DATE_TRUNC(MONTH, DT) as yyyymm,
LAG(DATE_TRUNC(MONTH, DT)) OVER (PARTITION BY user_id ORDER BY DATE_TRUNC(MONTH, DT)) as prev_yyyymm
FROM F_ACTIVITY
WHERE is_active = 1
GROUP BY user_id, DATE_TRUNC(MONTH, DT)
) um
GROUP BY yyyymm;