REGR_SLOPE 是计算线性回归直线斜率的聚合函数,即最小二乘法拟合 y = a + b×x 中的 b 值,公式为 COVAR_POP(y,x)/VAR_POP(x);参数顺序为 REGR_SLOPE(y,x),要求至少2组非NULL数值对,否则返回NULL。

REGR_SLOPE 是什么,它到底在算什么?
REGR_SLOPE 是 SQL 标准(如 Oracle、PostgreSQL 的 regr_slope())中用于线性回归分析的聚合函数,它计算的是因变量 y 对自变量 x 的最小二乘回归直线的斜率。不是简单平均差值,而是拟合一条直线 y = a + b * x 后的 b 值。
常见误解是把它当“y/x 的平均”,实际它依赖协方差与 x 的方差: b = COVAR_POP(x,y) / VAR_POP(x)。所以必须至少有 2 行非 NULL 的 (x,y) 对,否则返回 NULL。
怎么写才能不出错?参数顺序和 NULL 处理是关键
语法固定为 REGR_SLOPE(y, x) —— 注意:**先 y 后 x**,和多数统计库(如 Python 的 scipy.stats.linregress)顺序一致,但和某些文档图示相反。写反会导致结果无意义甚至报错(如 PostgreSQL 会静默返回 NaN 或 NULL)。
-
y和x必须是数值类型(NUMERIC、DOUBLE PRECISION等),字符串或日期需显式转换 - 任意一个为 NULL 的行会被整个排除(类似
WHERE x IS NOT NULL AND y IS NOT NULL) - 如果只剩 0 或 1 行有效数据,
REGR_SLOPE返回 NULL —— 不报错,但容易被忽略 - Oracle 中该函数只能用于 GROUP BY 查询或窗口函数;PostgreSQL 要求用
regr_slope(y,x)(小写,且属于statistical aggregate functions)
实战例子:从销售数据算「价格每涨 1 元,销量下降多少」
假设表 sales 有字段 price(自变量)和 quantity(因变量),想评估价格弹性:
SELECT REGR_SLOPE(quantity, price) AS slope FROM sales WHERE quantity > 0 AND price > 0;
这个查询返回负数才合理(价格↑ → 销量↓)。如果得到正数,要么数据异常(比如促销时高价高卖),要么字段传反了(把 price 当成第一个参数)。
若需分组计算(比如按品类),直接加 GROUP BY:
SELECT category, REGR_SLOPE(quantity, price) AS slope FROM sales GROUP BY category;
注意:每个 category 组内至少要有 2 条非 NULL 的 (quantity, price) 记录,否则对应 slope 为 NULL。
和其它回归函数搭配用才真正有用
单独一个斜率意义有限。常配合 REGR_INTERCEPT(截距)、REGR_R2(决定系数)、REGR_COUNT(有效点数)一起看:
-
REGR_R2(y,x)小于 0.3 说明线性关系很弱,斜率值参考价值低 -
REGR_COUNT(y,x)返回参与计算的行数,用来判断样本是否足够(比如 - Oracle 支持
REGR_AVGX/REGR_AVGY获取均值,方便还原回归线:y = REGR_INTERCEPT(y,x) + REGR_SLOPE(y,x) * x
真正麻烦的不是写法,而是理解它不处理异常值、不检验线性假设——它只是个公式计算器。业务上看到斜率 -2.3,得先确认数据里没有把批发单(单价低、数量大)和零售单混在一起算。

















