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

BigQuery统计前序周期购买但下一同期未购买的独立客户数

BigQuery 年度区间用户统计实现方案

原SQL问题说明

现有SQL的核心逻辑偏差为:仅校验了用户在统计月向后推1年的单月是否有消费,没有覆盖需求要求的完整12个月区间,同时也没有按「上年同月到当年同月」的12个月范围聚合用户,仅按单月用户做统计,因此输出结果不符合预期。

正确实现SQL

WITH
-- 步骤1:生成所有需要统计的目标月份列表,统计起始日期可按需调整
target_months AS (
  SELECT month
  FROM UNNEST(GENERATE_DATE_ARRAY('2020-01-01', DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR), INTERVAL 1 MONTH)) AS month
),
-- 步骤2:拉取全量用户的月度消费标记,提前去重减少计算量
user_monthly_active AS (
  SELECT DISTINCT
    DATE_TRUNC(order_date, MONTH) AS active_month,
    customer_id -- 如果你的表客户字段为CUSTOMER_WID,替换此处即可
  FROM t
  WHERE order_date >= '2019-01-01' -- 提前过滤最早需要用到的历史数据
),
-- 步骤3:对每个目标月,匹配两个区间的用户消费情况
user_interval_match AS (
  SELECT
    tm.month AS target_month,
    prev_user.customer_id,
    IF(next_user.customer_id IS NOT NULL, 1, 0) AS has_buy_next_period
  FROM target_months tm
  -- 关联上年同月到当年同月区间的活跃用户
  LEFT JOIN user_monthly_active prev_user
    ON prev_user.active_month >= DATE_SUB(tm.month, INTERVAL 1 YEAR)
    AND prev_user.active_month < tm.month
  -- 左关联当年同月到下年同月区间的活跃用户,匹配不到就是未消费用户
  LEFT JOIN user_monthly_active next_user
    ON next_user.active_month >= tm.month
    AND next_user.active_month < DATE_ADD(tm.month, INTERVAL 1 YEAR)
    AND prev_user.customer_id = next_user.customer_id
  WHERE prev_user.customer_id IS NOT NULL -- 过滤掉没有前序活跃用户的空记录
)
-- 步骤4:聚合统计结果
SELECT
  target_month AS order_date,
  COUNT(DISTINCT customer_id) AS `count distinct CustomerID`,
  COUNT(DISTINCT IF(has_buy_next_period = 0, customer_id, NULL)) AS `who not buy in the next period`
FROM user_interval_match
GROUP BY target_month
ORDER BY target_month

示例数据验证

用你提供的示例数据,统计2020-01-01的结果:

  • 前12个月区间(2019-01-01~2020-01-01)活跃用户为111、112,统计值为2
  • 后12个月区间(2020-01-01~2021-01-01)活跃用户为111、113,前序用户中仅112未消费,未消费用户统计值为1
    完全匹配需求逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:06:02