【问题标题】:SQL query for user reactivations用户重新激活的 SQL 查询
【发布时间】:2021-10-30 20:39:23
【问题描述】:

我正在尝试构建一个查询来计算每月用户重新激活次数,其中“重新激活”定义为(例如 2021 年 3 月):

  • 在 2021 年 1 月期间或之前发送活动
  • 2021 年 2 月期间未发送活动
  • 2021 年 3 月期间发送的活动

(因此 1 个或多个完整日历月没有活动作为不活动的阈值)。


源表 F_ACTIVITY 是每个用户每天的时间序列,包含列:

dt(日期)、user_id、is_active(布尔值)。

期望的结果是一个表格,显示:

月,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

【问题讨论】:

    标签: sql time-series snowflake-cloud-data-platform


    【解决方案1】:

    先按月份和用户汇总,然后使用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;
    

    【讨论】:

    • 太棒了,就像一个魅力。谢谢戈登!
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多