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探查节点 交易请求到达 SQL 实时探查 查询设备/用户/IP 聚合特征 规则 / 模型打分 通过 / 拒绝 / 人工 探查SQL示例 SELECT COUNT(DISTINCT user_id) FROM device_map WHERE device_id = ? AND time > NOW()-5min 延迟要求 • 探查SQL < 5ms • 使用预聚合表 • 避免JOIN大表
工程建议:实时探查 SQL 应避免使用 GROUP BY 扫描全表。优先使用预计算特征宽表(如每5秒更新一次的用户画像表),将探查延迟控制在 1-3ms 以内。

2.4 三种角色的对比总结

角色 执行频率 数据量级 延迟要求 典型SQL引擎
特征提取 批量/微批(分钟级) 百万~亿级 秒~分钟 Spark SQL / Hive
样本标注 批量(天级) 千万~十亿级 小时级 Hive / Presto
实时探查 单次请求(毫秒级) 单行~百行 < 10ms ClickHouse / Flink SQL / RedisSQL