4. SQL基础回顾:常用SQL聚合函数(COUNT, SUM, AVG, GROUP BY, HAVING)在风控统计中的应用
在实时交易风控巡检中,SQL聚合函数是分析交易数据、计算统计指标、发现异常波动的核心工具。本节将回顾最常用的聚合函数及其在风控场景中的典型用法,为后续的PSI计算和Drift监控打下坚实基础。
4.1 核心聚合函数速览
| 函数 | 语法 | 风控统计用途 |
|---|---|---|
| COUNT | COUNT(column) / COUNT(*) |
统计交易笔数、异常交易次数、某类客群数量 |
| SUM | SUM(column) |
计算交易总金额、累计损失、总手续费 |
| AVG | AVG(column) |
计算平均交易金额、平均响应时间、平均风险评分 |
| MAX / MIN | MAX(column) / MIN(column) |
找出单笔最大/最小交易金额、极端值检测 |
风控提示:在实时巡检中,
COUNT(*) 常用于统计窗口内的交易流量,SUM(amount) 用于监控资金净流入/流出,两者结合可快速发现流量突增或金额异常。
4.2 GROUP BY:按维度聚合统计
GROUP BY 是风控统计的“分组器”,它允许我们按业务维度(如商户ID、渠道、卡BIN、地区)对数据进行切片聚合,从而发现不同分组的风险特征差异。
典型风控分组场景:
- 按 商户 统计各商户的交易笔数和成功率
- 按 交易渠道 统计各渠道的平均交易金额
- 按 小时/分钟 统计时间窗口内的交易量变化
- 按 风险等级 统计各等级的交易分布
-- 示例:按商户统计当日交易笔数和总金额
SELECT
merchant_id,
COUNT(*) AS tx_count,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount
FROM transaction_log
WHERE event_date = CURRENT_DATE
GROUP BY merchant_id
ORDER BY total_amount DESC;
巡检要点:GROUP BY 后的列必须出现在 SELECT 列表中(聚合函数除外)。在实时流处理中,GROUP BY 通常配合窗口函数(如 TUMBLE、HOP)使用,实现滑动窗口内的聚合统计。
4.3 HAVING:对聚合结果进行过滤
HAVING 是 WHERE 的“聚合版”,它允许我们对 GROUP BY 后的聚合结果进行条件过滤。在风控巡检中,HAVING 常用于筛选出“异常分组”。
-- 示例:筛选出当日交易笔数超过1000笔且平均金额大于5000的商户
SELECT
merchant_id,
COUNT(*) AS tx_count,
AVG(amount) AS avg_amount
FROM transaction_log
WHERE event_date = CURRENT_DATE
GROUP BY merchant_id
HAVING COUNT(*) > 1000 AND AVG(amount) > 5000
ORDER BY tx_count DESC;
| 过滤子句 | 过滤时机 | 能否使用聚合函数 | 典型风控场景 |
|---|---|---|---|
| WHERE | 分组之前 | 否 | 过滤特定时间段、特定渠道的交易 |
| HAVING | 分组之后 | 是 | 筛选高频交易商户、高金额渠道、异常聚合指标 |
常见错误:不要将聚合条件写在 WHERE 中,如
WHERE COUNT(*) > 1000 会报错。聚合过滤必须使用 HAVING。
4.4 聚合函数在PSI监控中的前置应用
在后续章节中,我们将使用PSI(群体稳定性指标)监控特征分布的漂移。而PSI的计算依赖于聚合统计——我们需要按分箱统计每个区间的样本占比。以下SQL展示了PSI计算的前置步骤:
-- 示例:按交易金额分箱,统计各箱的样本数(PSI计算的第一步)
SELECT
CASE
WHEN amount BETWEEN 0 AND 100 THEN '0-100'
WHEN amount BETWEEN 101 AND 500 THEN '101-500'
WHEN amount BETWEEN 501 AND 2000 THEN '501-2000'
ELSE '2000+'
END AS amount_bin,
COUNT(*) AS bin_count,
COUNT(*) * 1.0 / SUM(COUNT(*)) OVER() AS bin_ratio
FROM transaction_log
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-07'
GROUP BY
CASE
WHEN amount BETWEEN 0 AND 100 THEN '0-100'
WHEN amount BETWEEN 101 AND 500 THEN '101-500'
WHEN amount BETWEEN 501 AND 2000 THEN '501-2000'
ELSE '2000+'
END
ORDER BY amount_bin;
PSI前置知识:上述SQL中的
SUM(COUNT(*)) OVER() 是窗口函数,用于计算总样本数,从而得到每个分箱的占比。这个占比序列就是PSI公式中的“实际分布”或“期望分布”的输入。
4.5 聚合函数执行流程(SVG)
下图展示了SQL聚合查询在风控统计中的完整执行流程,从数据读取到最终结果输出:
4.6 风控聚合统计实战案例
以下是一个完整的实时风控巡检SQL示例,综合运用了本节所学的聚合函数、GROUP BY和HAVING:
-- 实时风控巡检:检测过去5分钟内各渠道的异常交易
SELECT
channel_id,
COUNT(*) AS tx_count,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount,
MAX(amount) AS max_amount,
COUNT(CASE WHEN risk_score > 80 THEN 1 END) AS high_risk_count
FROM transaction_log
WHERE event_time >= NOW() - INTERVAL '5 minutes'
AND status = 'completed'
GROUP BY channel_id
HAVING COUNT(*) > 100
OR SUM(amount) > 500000
OR AVG(amount) > 10000
ORDER BY high_risk_count DESC;
巡检指标解读:
- tx_count > 100:5分钟内交易笔数超过100笔,可能存在流量突增
- total_amount > 500,000:累计金额超过50万,可能存在大额资金异常
- avg_amount > 10,000:平均金额超过1万,可能存在金额分布偏移
- high_risk_count:高风险交易数量,辅助判断渠道风险等级
4.7 聚合函数与PSI的关联(SVG)
下图展示了聚合函数如何为PSI监控提供数据基础,以及两者在Drift检测中的协作关系: