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
我们有:
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 |