传统 BI 擅长回答“发生了什么”,但当业务追问“为什么变化”“变化从哪天开始”“活动究竟带来了多少增量”时,分析师往往需要在 SQL、统计脚本和外部建模工具之间来回切换。BigQuery 新增的一组增强分析表值函数(Table-Valued Functions,TVF),把变化点检测、关键驱动因素分析、趋势与季节性分解、相关性和因果效应估计直接放进了 SQL。
这项变化的价值不只是少写几段 Python。TVF 返回结构化结果,既能继续参与 SQL 查询,也适合封装成 AI Agent 的分析技能,让代理按照“发现异常—解释原因—评估影响”的路径自动调查数据。
六个函数分别解决什么问题
这组增强分析能力由六个目标明确的函数组成:
| 函数 | 分析任务 | 典型问题 |
|---|---|---|
AI.KEY_DRIVERS |
找出两个时期或两组数据之间,哪些维度最能解释指标变化 | 为什么本季度收入突然增长? |
AI.CAUSAL_EFFECT |
根据反事实基线估算某项行动或事件的净影响 | 调价带来的收入增量是多少,而不是自然增长多少? |
ML.CORRELATION |
衡量数值指标之间关系的方向与强度 | 会话时长是否与客户终身价值相关? |
ML.DETECT_CHANGE_POINTS |
找到时间序列发生结构性变化的日期或区间 | 平台延迟从什么时候开始持续恶化? |
ML.TREND |
从短期波动和噪声中分离长期趋势 | 过去一年收入的基础走势如何? |
ML.SEASONALITY |
发现按小时、星期、月份或季度重复的周期 | 每周哪几天服务器负载最高? |
这些函数最值得关注的设计,是输入和输出仍然属于 SQL 世界。结果可以被 WHERE、JOIN、CTE 或后续 TVF 消费,而不必先导出 CSV,再启动独立的分析服务。
一条可组合的调查链:何时变化、谁在推动、净增量多少
以公开的 Austin Bikeshare 数据集为例,可以把调查拆成三个连续步骤。
1. 先检测结构性变化
下面的查询可直接放入 BigQuery 控制台运行。它先聚合每日骑行量,再寻找统计意义上的基线变化区间:
WITH daily_trips AS (
SELECT
TIMESTAMP_TRUNC(start_time, DAY) AS trip_day,
COUNT(*) AS total_trips
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
GROUP BY 1
)
SELECT
begin_timestamp,
end_timestamp,
metrics.avg AS avg_daily_trips,
metrics.min AS min_daily_trips,
metrics.max AS max_daily_trips,
metrics.count AS duration_days
FROM ML.DETECT_CHANGE_POINTS(
(SELECT * FROM daily_trips),
data_col => 'total_trips',
timestamp_col => 'trip_day'
);
这个步骤不是找出单日尖峰,而是识别相对于周边模式持续存在的结构性改变。来源案例将一个重要断点定位到 2018 年 2 月,并把它用于后续分析。
2. 再定位推动变化的业务切片
有了断点,可以建立等长的前后窗口,把断点之后标记为关注组、之前标记为参考组,然后检查站点、订阅类型和车辆类型等维度:
WITH daily_segments AS (
SELECT
start_station_name,
end_station_name,
subscriber_type,
bike_type,
1 AS trip_count,
IF(DATE(start_time) >= DATE '2018-02-11', TRUE, FALSE) AS after_shift
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
WHERE start_time BETWEEN TIMESTAMP '2018-01-12'
AND TIMESTAMP '2018-03-13'
)
SELECT
drivers,
metric_interest,
metric_reference,
difference,
relative_difference,
unexpected_difference,
contribution
FROM AI.KEY_DRIVERS(
(SELECT * FROM daily_segments),
metric_col => 'trip_count',
interest_label_col => 'after_shift',
dimension_cols => [
'start_station_name',
'end_station_name',
'subscriber_type',
'bike_type'
],
top_k => 10
);
每一行结果代表一个具体数据切片,而不只是给出“订阅类型很重要”这样的笼统判断。案例中,总骑行量在两个窗口之间增长了 374.7%,增长主要集中于得州大学学生会员,以及以 21st & Speedway @PCL 为终点的行程。这与当时推出的学生免费年费会员合作相吻合。
运行自己的数据时,需要替换三类内容:源表、指标列和候选维度。候选维度不要无节制加入高基数字段,例如用户 ID、订单 ID 或自由文本,否则结果可能过细、成本也会增加。
3. 最后估算活动之外的净增量
“某类会员贡献最大”仍然不等于“活动造成了全部增长”。天气、季节、长期增长和其他市场活动都可能同时影响结果。AI.CAUSAL_EFFECT 会基于干预前数据构建 ARIMA_PLUS 反事实基线,估计如果事件没有发生,指标可能呈现什么走势:
WITH daily_trips AS (
SELECT
TIMESTAMP_TRUNC(start_time, DAY) AS trip_day,
COUNT(*) AS total_trips
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
WHERE start_time BETWEEN TIMESTAMP '2017-08-11'
AND TIMESTAMP '2018-04-11'
GROUP BY 1
)
SELECT *
FROM AI.CAUSAL_EFFECT(
(SELECT * FROM daily_trips),
data_col => 'total_trips',
timestamp_col => 'trip_day',
intervention_timestamp => TIMESTAMP '2018-02-11 00:00:00',
output_time_series => TRUE
);
设置 output_time_series => TRUE 适合把实际值和反事实预测画在同一张图上;改成 FALSE,则更适合获取汇总影响。来源案例估算该计划使骑行量高于自然基线约 358%,产生约 89,775 次增量骑行,并给出了 99.9% 的因果效应概率。
这里必须保留统计边界:反事实模型并不会自动消除同期发生的所有混杂事件。若干预日期附近同时上线了促销、扩容或计量规则变更,应补充对照序列、敏感性分析和业务证据,不能把模型输出直接当作实验结论。
为什么这些 TVF 特别适合 AI Agent
数据代理最难的部分通常不是生成一条 SELECT,而是把模糊问题拆成可靠步骤。紧凑、结构化的 TVF 可以被注册成独立工具,并由代理按结果继续规划:
- 用
ML.DETECT_CHANGE_POINTS找到候选断点; - 把断点传给
AI.KEY_DRIVERS,比较前后窗口; - 根据驱动因素生成解释假设;
- 用
AI.CAUSAL_EFFECT估计干预的净影响; - 返回数据表、置信信息和自然语言摘要,而不是只给一句结论。
实践中可以为代理工具定义受控参数,而不是允许模型任意拼接 SQL。例如只开放经过审核的数据集、时间列、指标列和维度白名单,并限制扫描区间与 top_k。这样既能降低查询成本,也能减少 SQL 注入、越权访问和高基数分析带来的风险。
相关性分析同样适合组合。来源中的 Chicago Taxi 示例先用 ML.CORRELATION 找出与司机获得小费关系最强的指标,再用 AI.KEY_DRIVERS 分析地点、支付方式等类别维度。另一个 Iowa 酒类销售示例则串联 ML.TREND 与 ML.SEASONALITY,把长期增长和年度周期拆开解释。
上线前的检查清单
将这些函数接入生产分析或对话式代理时,建议逐项确认:
- 指标口径稳定:断点可能来自埋点、时区、去重或计算公式变化,而不是业务变化。
- 时间粒度合理:小时级噪声可能淹没长期趋势,月级聚合又可能隐藏短期冲击。
- 前后窗口可比:节假日、季节和样本覆盖范围要尽量一致。
- 维度经过治理:限制敏感字段、高基数字段和可识别个人的信息。
- 成本有上限:先检查扫描量,再为代理设置数据范围、并发和预算限制。
- 区分相关与因果:
ML.CORRELATION只能描述关系;因果估计也依赖反事实模型及其假设。 - 保留可审计记录:保存代理使用的 SQL、参数、数据版本与最终解释,方便复核。
BigQuery 增强分析 TVF 的核心意义,是把高级分析从一次性的外部建模任务变成可查询、可组合、可治理的数据能力。对于开发团队,合适的落地顺序不是立刻让 Agent 自主运行所有函数,而是先固化一两条高价值调查链,在人工审核下验证指标和解释,再逐步开放自动编排。