You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按列值变化统计用户:统计从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';

代码解释

  1. 子查询部分:通过LAG()窗口函数,为每个客户的每一天记录,匹配出它前一天的状态。这样我们就能清晰看到每个客户的状态变化链路。
  2. 外层筛选:只保留「当天是paying,前一天是trial」的行,这些就是真正的转换节点。
  3. 去重统计:用COUNT(DISTINCT)确保同一个客户就算多次转换(比如先trial→paying,后来又expired→trial→paying)也只会被统计一次。如果你的需求是统计所有转换次数,去掉DISTINCT即可。

边界情况说明

  • 如果客户第一天进入系统就是paying状态,previous_day_status会是NULL,不会被统计,符合逻辑。
  • 如果客户状态是trial→expired→paying,这种间接转换也不会被统计,因为前一天状态是expired而非trial,这正好匹配我们要的「直接从trial转paying」的需求。

内容的提问来源于stack exchange,提问作者user2022284

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:24:19