Postgres中无需子查询/CTE,对多列使用var_samp()聚合函数
在PostgreSQL中无需子查询/CTE对多列计算var_samp()
要实现对多列所有数据计算样本方差,且避免子查询或CTE以追求查询速度,你可以用隐式横向连接的写法,仅扫描一次表就能完成计算:
SELECT var_samp(val) AS varsample FROM my_table, unnest(array[obs1, obs2]) AS val;
写法说明
PostgreSQL中,FROM子句里的逗号等价于CROSS JOIN LATERAL,unnest(array[obs1, obs2])会把每一行的obs1和obs2拆成两行独立的val值,之后直接对所有val执行var_samp()聚合,结果和你用CTE得到的完全一致,且执行效率更高。
你之前尝试的问题分析
- 第一种写法
var_samp(array[obs1,obs2])无效,因为var_samp()是针对单列的聚合函数,不接受数组类型参数。 - 你参考的子查询写法失败,大概率是因为子查询未加别名,正确的子查询写法应为:
SELECT var_samp(my_col) FROM (SELECT unnest(array[obs1, obs2]) AS my_col FROM my_table) t;
但该写法仍用到子查询,不如推荐写法简洁高效。
结果验证
用你提供的my_table数据(25行共50个观测值),推荐写法会计算所有50个值的样本方差,结果与CTE实现完全一致。
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

