SQL 大查询。检查用户上个月是否买过东西 = 旧,如果他下个月没有买任何东西 = 流失

SQL BigQuery. Check if user bought something previous month = old, if he didn't buy anything next month = churn

我们有:

 user_id month
    ---- 2021-08  
    1414 2021-09  
    1414 2021-10 
    1414 2021-11
    ---- 2021-12

我们需要什么:

 user_id month
    ---- 2021-08
    1414 2021-09 new user
    1414 2021-10 old
    1414 2021-11 churn
    ---- 2021-12

最后,我将汇总所有具有 COUNT(new_user) 和 GROUP BY 状态的用户...

但是,我在这个阶段遇到了问题,我需要在特定月份内为用户分配正确的值

类似这样的方法可能有效。

第一个 test CTE 术语只是为了提供测试 table 数据。

WITH test (user_id, month) AS (
    SELECT 1414, '2021-09' UNION
    SELECT 1414, '2021-10' UNION
    SELECT 1414, '2021-11' UNION
    SELECT null, '2021-08' UNION
    SELECT null, '2021-12'
     )
   , xrows AS (
    SELECT *
         , LAG(month)  OVER (PARTITION BY user_id ORDER BY month) AS lastval
         , LEAD(month) OVER (PARTITION BY user_id ORDER BY month) AS nextval
      FROM test
     )
SELECT user_id, month
     , CASE WHEN user_id IS NOT NULL THEN
            CASE WHEN nextval IS NULL THEN 'churn'
                 WHEN lastval IS NULL THEN 'new user'
                 ELSE 'old'
             END
        END AS status
  FROM xrows
 ORDER BY month
;

-- or

WITH test (user_id, month) AS (
    SELECT 1414, '2021-09' UNION
    SELECT 1414, '2021-10' UNION
    SELECT 1414, '2021-11' UNION
    SELECT null, '2021-08' UNION
    SELECT null, '2021-12'
     )
   , xrows AS (
    SELECT *
         , LAG(month)  OVER w AS lastval
         , LEAD(month) OVER w AS nextval
      FROM test
    WINDOW w AS (PARTITION BY user_id ORDER BY month)
     )
SELECT user_id, month
     , CASE WHEN user_id IS NOT NULL THEN
            CASE WHEN nextval IS NULL THEN 'churn'
                 WHEN lastval IS NULL THEN 'new user'
                 ELSE 'old'
             END
        END AS status
  FROM xrows
 ORDER BY month
;

结果:

user_id month status
2021-08
1414 2021-09 new user
1414 2021-10 old
1414 2021-11 churn
2021-12