VAR_POP计算总体方差(分母为n),适用于质量控制中评估整批产品自身波动性;若目标是用样本推断总体,则应选用VAR_SAMP(分母为n−1)。
VAR_POP 计算的是总体方差(Population Variance),即把整批数据当作完整总体来处理,分母是 n 而不是 n-1。在质量控制中,比如一批零件的尺寸、某批次药品的含量测定值,你往往关心“这批货整体波动有多大”,而不是去推断未知总体——这时候用 VAR_POP 比 VAR_SAMP 更合理。
常见错误是直接套用 Excel 里的 VAR.P() 或 Python 的 numpy.var(ddof=0),却没确认数据库是否默认支持 VAR_POP;MySQL 8.0+、PostgreSQL、Oracle 都支持,但 SQLite 和旧版 MySQL 不支持。
语法很简单:VAR_POP(column_name),但它对 NULL 和数据类型很敏感:
VAR_POP 会自动忽略 NULL 值,但若整列全为 NULL,结果返回 NULL,不是 0 —— 这可能让下游告警逻辑失效INT、FLOAT、DECIMAL),如果字段是 VARCHAR 存数字,得先 CAST,否则报错 ERROR 1292: Truncated incorrect DOUBLE value
GROUP BY 的情况下混用聚合和非聚合字段,否则报错 ERROR 1140: In aggregated query without GROUP BY
示例(检查某批次产品重量波动):
SELECT batch_id, VAR_POP(weight_g) AS pop_varianceFROM production_records WHERE batch_id = 'BATCH-2024-001'GROUP BY batch_id;
关键看你的分析目标:
VAR_POP(分母是实际样本数 n)VAR_SAMP(分母是 n-1,无偏估计)VAR_POP,否则计算出的 Cpk(过程能力指数)会系统性偏低n 很大(>100)时,两者差异很小;但 n 小于 10 时,VAR_POP 比 VAR_SAMP 小约 10%–20%,直接影响合格率判断VAR_POP 内部先算平均值再逐项平方差,所以对极端值敏感,也受浮点精度影响:
AVG 可能因舍入丢失精度,导致方差偏差;建议先中心化:用 SUM(POWER(x - avg_x, 2)) / COUNT(*) 替代内置函数(但性能下降)VAR_POP 返回 double precision,但 Oracle 默认返回 NUMBER,小数位数可能被截断,需显式 ROUND(VAR_POP(x), 6)
VAR_POP 结果识别为字符串,需在视图里加 ::float 强转真正麻烦的不是不会写 VAR_POP,而是没意识到它隐含了“你已拥有全部总体”的前提——而现实中,很多所谓“整批数据”其实是抽检记录,这时强行用 VAR_POP 反而掩盖了抽样不确定性。