开窗函数通过AVG()和STDDEV()配合OVER(PARTITION BY)动态计算分组均值与标准差,再用“均值±2倍标准差”判定离群值,确保每行基于其所属分组的统计基准实时识别异常。

开窗函数怎么识别离群值:用 AVG() 和 STDDEV() 搭配 OVER()
离群值不是靠肉眼判断的,得量化。常见做法是“均值 ± 2 倍标准差”,这个范围外的值就标为异常。关键在于:不能先算全表统计再 JOIN,那样会丢失窗口上下文;必须用开窗函数在每行动态计算当前分组的基准。
比如按 user_id 分组检测单次订单金额是否异常:
STDDEV()
- 把开窗逻辑包进子查询,外层再
WHERE is_outlier = 1 - 用 CTE(
WITH子句),语义更清晰,也方便复用中间统计值
CTE 写法示例(推荐):
PERCENT_RANK()
- 用
PERCENT_RANK() OVER (ORDER BY amount DESC) 找金额最高的 1% - 用
NTILE(100) OVER (ORDER BY amount DESC) = 1效果类似,但更易理解 - 注意:两者都默认按整个结果集排序;如需分组内找离群,必须加
PARTITION BY
例如按城市找高价订单中的前 1%:
STDDEV()
- 加
COUNT(*) OVER (PARTITION BY ...)判断分组大小,COUNT = 1时跳过标准差逻辑 - 用
COALESCE(STDDEV(...), 0)强制补 0,但要清楚补 0 后的阈值含义已变(相当于只用均值判断) - PostgreSQL 可用
STDDEV_POP()(总体标准差),它对单值返回 0,但语义上不如样本标准差常用
真正容易被忽略的是:不同数据库对空组、全 NULL 列的开窗聚合行为不一致。上线前务必用真实小数据集验证边界 case,尤其关注只有 1 条或全是 NULL 的分组输出。










