2. SQL在风控中的角色:特征提取、样本标注与实时决策流数据探查
在实时风控系统中,SQL 是连接原始数据与决策逻辑的核心桥梁。它承担着三大关键职责:特征提取(将日志/交易表转化为模型可用的数值特征)、样本标注(为监督学习生成正负样本标签)、以及实时决策流中的数据探查(在毫秒级规则链中快速查询上下文)。本章从这三个维度拆解 SQL 的具体应用模式。
2.1 特征提取:从原始表到模型特征
风控特征通常来自用户历史行为、设备指纹、交易序列等异构数据。SQL 通过聚合、窗口函数、条件计数等方式,将多行记录压缩为单行特征向量。
| 特征类型 | SQL 核心操作 | 典型场景 |
|---|---|---|
| 计数类 | COUNT(*) + WHERE 时间窗口 |
过去1小时交易次数 |
| 金额类 | SUM(amount) / AVG(amount) |
近7天累计交易金额 |
| 极值类 | MAX() / MIN() |
单笔最大金额 |
| 序列类 | LAG() / LEAD() 窗口函数 |
相邻两笔交易时间间隔 |
| 比率类 | SUM(CASE WHEN ...) 嵌套 |
失败交易占比 |
实战要点:特征提取 SQL 必须考虑时间边界一致性。训练时使用历史时间窗口,上线后使用实时滑动窗口,避免特征穿越(future leakage)。
-- 示例:提取用户过去1小时交易次数与总金额(实时特征)
SELECT
user_id,
COUNT(*) AS tx_cnt_1h,
SUM(amount) AS tx_amt_1h,
AVG(amount) AS tx_avg_amt_1h
FROM transaction_log
WHERE event_time >= NOW() - INTERVAL '1 hour'
AND event_time < NOW()
GROUP BY user_id;
2.2 样本标注:用SQL生成训练标签
样本标注是监督学习的起点。风控中通常以“交易发生后N天内是否逾期/欺诈”作为正样本标签。SQL 通过左连接未来事件表或窗口偏移来实现。
- 正样本(bad):交易后7天内发生逾期、拒付或投诉。
- 负样本(good):交易后30天无任何风险事件。
- 排除样本:交易后尚未满观察期的记录(避免标签不完整)。
-- 示例:为交易流水标注逾期标签
SELECT
t.txn_id,
t.user_id,
t.txn_time,
CASE
WHEN o.overdue_time IS NOT NULL THEN 1
ELSE 0
END AS label
FROM transaction_log t
LEFT JOIN overdue_log o
ON t.user_id = o.user_id
AND o.overdue_time >= t.txn_time
AND o.overdue_time < t.txn_time + INTERVAL '7 days'
WHERE t.txn_time < NOW() - INTERVAL '30 days'; -- 确保观察期已满
样本偏差陷阱:实时风控中,标注 SQL 常因“观察期不足”导致负样本比例虚高。务必在 WHERE 条件中剔除观察期未结束的样本,否则模型会低估风险。
2.3 实时决策流中的数据探查
在毫秒级实时决策链路中,SQL 用于快速查询当前请求的上下文数据,例如:查询该设备过去5分钟关联的账号数、查询该IP是否在最近1小时的黑名单中。这类查询对延迟极度敏感,通常使用预聚合表或内存SQL引擎(如 Flink SQL / ClickHouse)执行。
工程建议:实时探查 SQL 应避免使用
GROUP BY 扫描全表。优先使用预计算特征宽表(如每5秒更新一次的用户画像表),将探查延迟控制在 1-3ms 以内。
2.4 三种角色的对比总结
| 角色 | 执行频率 | 数据量级 | 延迟要求 | 典型SQL引擎 |
|---|---|---|---|---|
| 特征提取 | 批量/微批(分钟级) | 百万~亿级 | 秒~分钟 | Spark SQL / Hive |
| 样本标注 | 批量(天级) | 千万~十亿级 | 小时级 | Hive / Presto |
| 实时探查 | 单次请求(毫秒级) | 单行~百行 | < 10ms | ClickHouse / Flink SQL / RedisSQL |