按列值变化统计用户:统计从trial转为paying的客户ID数量
解决从trial转为paying的客户统计问题
我太懂这种看起来简单却卡壳的感觉了!这种每日快照式的状态表,统计状态转换很容易因为重复记录或者状态连续变化踩坑。咱们一步步来搞定它:
核心思路
我们需要找到真正发生了从trial到paying状态转换的唯一客户,关键是要追踪每个客户每天的状态变化,筛选出「当天状态是paying,且前一天状态是trial」的记录,最后去重统计客户数。
具体SQL实现
用窗口函数LAG()来获取每个客户前一天的状态,这是处理这种时序状态变化的利器:
SELECT COUNT(DISTINCT customer_id) AS trial_to_paying_customers FROM ( SELECT customer_id, dates, status, -- 按客户分组、日期排序,获取前一天的状态 LAG(status) OVER (PARTITION BY customer_id ORDER BY dates) AS previous_day_status FROM your_table_name -- 替换成你的表名 ) AS daily_status_changes -- 筛选出从trial转为paying的记录 WHERE status = 'paying' AND previous_day_status = 'trial';
代码解释
- 子查询部分:通过
LAG()窗口函数,为每个客户的每一天记录,匹配出它前一天的状态。这样我们就能清晰看到每个客户的状态变化链路。 - 外层筛选:只保留「当天是paying,前一天是trial」的行,这些就是真正的转换节点。
- 去重统计:用
COUNT(DISTINCT)确保同一个客户就算多次转换(比如先trial→paying,后来又expired→trial→paying)也只会被统计一次。如果你的需求是统计所有转换次数,去掉DISTINCT即可。
边界情况说明
- 如果客户第一天进入系统就是
paying状态,previous_day_status会是NULL,不会被统计,符合逻辑。 - 如果客户状态是
trial→expired→paying,这种间接转换也不会被统计,因为前一天状态是expired而非trial,这正好匹配我们要的「直接从trial转paying」的需求。
内容的提问来源于stack exchange,提问作者user2022284
相关产品推荐
相关产品推荐

