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

如何简化BigQuery中基于用户首末次交互的52周用户参与度计算?

简化52周Cohort分析的BigQuery实现

核心思路

不用手动编写52个周统计字段,而是通过生成周偏移量序列结合窗口函数,动态计算每个用户在首次交互后各周的活跃情况,大幅简化查询结构并降低维护成本。

具体实现

WITH user_cohorts AS (
  -- 提取每个用户的首次交互周(Cohort分组)及所有交互记录
  SELECT
    user_id,
    DATE_TRUNC(MIN(interaction_time), WEEK) AS cohort_week,  -- 按周划分Cohort组
    interaction_time
  FROM
    `your-project.your-dataset.your-interaction-table`
  WHERE
    interaction_time >= DATE_SUB(CURRENT_DATE(), INTERVAL 52 WEEK)  -- 限定过去52周数据
  GROUP BY
    user_id, interaction_time
),
week_offsets AS (
  -- 生成0到51的周偏移量(对应首次交互后的第0周到第51周)
  SELECT
    offset
  FROM
    UNNEST(GENERATE_ARRAY(0, 51)) AS offset
)
-- 关联数据并统计各Cohort每周的活跃用户数
SELECT
  cohort_week,
  offset AS weeks_since_cohort,
  COUNT(DISTINCT user_id) AS active_users
FROM
  user_cohorts
CROSS JOIN
  week_offsets
WHERE
  -- 判断交互时间是否属于首次交互后的对应周
  DATE_DIFF(DATE_TRUNC(interaction_time, WEEK), cohort_week, WEEK) = offset
GROUP BY
  cohort_week, offset
ORDER BY
  cohort_week, weeks_since_cohort;

关键说明

  • user_cohorts子句:一次性获取所有用户的Cohort分组和交互记录,避免重复查询原始表。
  • week_offsets子句:用GENERATE_ARRAY自动生成周偏移序列,无需手动编写52行重复代码。
  • 关联逻辑:通过DATE_DIFF匹配用户交互时间对应的周偏移,再按Cohort和偏移量聚合统计。

扩展:计算留存率

如果需要统计各周活跃用户占Cohort总用户的比例,可加入Cohort规模计算:

WITH user_cohorts AS (
  SELECT
    user_id,
    DATE_TRUNC(MIN(interaction_time), WEEK) AS cohort_week,
    interaction_time
  FROM
    `your-project.your-dataset.your-interaction-table`
  WHERE
    interaction_time >= DATE_SUB(CURRENT_DATE(), INTERVAL 52 WEEK)
  GROUP BY
    user_id, interaction_time
),
cohort_sizes AS (
  -- 计算每个Cohort的总用户数
  SELECT
    cohort_week,
    COUNT(DISTINCT user_id) AS total_cohort_users
  FROM
    user_cohorts
  GROUP BY
    cohort_week
),
week_offsets AS (
  SELECT
    offset
  FROM
    UNNEST(GENERATE_ARRAY(0, 51)) AS offset
)
SELECT
  cs.cohort_week,
  wo.offset AS weeks_since_cohort,
  COUNT(DISTINCT uc.user_id) AS active_users,
  ROUND(COUNT(DISTINCT uc.user_id) / cs.total_cohort_users, 4) AS retention_rate
FROM
  user_cohorts uc
CROSS JOIN
  week_offsets wo
JOIN
  cohort_sizes cs ON uc.cohort_week = cs.cohort_week
WHERE
  DATE_DIFF(DATE_TRUNC(uc.interaction_time, WEEK), uc.cohort_week, WEEK) = wo.offset
GROUP BY
  cs.cohort_week, wo.offset, cs.total_cohort_users
ORDER BY
  cs.cohort_week, wo.offset;

优势对比

  • 代码量固定,调整统计周期只需修改GENERATE_ARRAY的参数(比如改成0,103就是2年数据)。
  • 避免手动复制粘贴导致的错误,维护成本极低。
  • 利用BigQuery数组和交叉连接特性,性能优于多次重复子查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:33:01