Postgres中如何跨列计算均值与极差?
Postgres宽表行级跨列计算(类似Pandas axis=1)
简便实现方案
直接将需要计算的列转为数组,利用Postgres内置的数组函数完成行级均值和极差计算,写法和Pandas指定axis=1处理每行的逻辑一致:
假设你的表为obs_data,执行以下SQL:
SELECT "group", obs1, obs2, obs3, obs4, obs5, -- 可选:保留原始观测列 -- 计算行均值 array_avg(ARRAY[obs1, obs2, obs3, obs4, obs5]) AS grp_avg, -- 计算行极差(最大值-最小值) array_max(ARRAY[obs1, obs2, obs3, obs4, obs5]) - array_min(ARRAY[obs1, obs2, obs3, obs4, obs5]) AS grp_range FROM obs_data;
兼容低版本Postgres(<10)
如果你的Postgres版本不支持array_avg/array_max/array_min,可以用子查询+unnest实现:
SELECT "group", obs1, obs2, obs3, obs4, obs5, (SELECT avg(val) FROM unnest(ARRAY[obs1, obs2, obs3, obs4, obs5]) AS val) AS grp_avg, (SELECT max(val) - min(val) FROM unnest(ARRAY[obs1, obs2, obs3, obs4, obs5]) AS val) AS grp_range FROM obs_data;
关键说明
ARRAY[obs1, obs2,...]将每行的目标列打包成数组,对应Pandas中选取每行指定列的操作- 函数会自动忽略NULL值,和Pandas默认行为一致
- 写法简洁,无需复杂的窗口函数或行转列操作
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

