aag*_*aag 4 postgresql statistics null aggregate standard-deviation
我的Postgres查询从一堆传感器读数计算统计聚合:
SELECT to_char(ipstimestamp, 'YYYYMMDDHH24') As row_name,
to_char(ipstimestamp, 'FMDD mon FMHH24h') As hour_row_name,
varid As category,
(AVG(ipsvalue)::NUMERIC(5,2)) ||', ' ||
(MAX(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' ||
(MIN(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' ||
(STDDEV(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' As StatisticsValue
FROM loggingdb_ips_integer As log
JOIN ipsobjects_with_parent ips ON log.varid = ips.objectid
AND (ipstimestamp > (now()- '2 days'::interval))
GROUP BY row_name, hour_row_name, category;
Run Code Online (Sandbox Code Playgroud)
只要我有> 1 ipsvalue/hour,这就可以正常工作.但是,如果每小时COUNT(ipsvalue)<2,则StatisticsValue返回NULL而没有任何Postgres错误.
如果我注释掉STTDEV,如下所示:
(AVG(ipsvalue)::NUMERIC(5,2)) ||', ' ||
(MAX(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' ||
(MIN(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' As value
Run Code Online (Sandbox Code Playgroud)
然后正确计算所有三个统计数据.因此,我得出结论,非法STDDEV会导致整个查询失效.我宁愿让非法的STDDEV返回0.我试图COALESCE STDDEV线,但无济于事.可以做些什么?
COALESCE 应该管用.
您也可以使用(它适合您)" 人口标准偏差 " stddev_pop,而不是"样本标准偏差" stddev_samp; 后者是分开的n-1,是别名的STDDEV. stddev_pop相反,除以n,NULL当给出一个样本时,它返回零(而不是).
如果您不知道这些估算器之间的差异,则会在每个统计教科书中对其进行解释,例如http://en.wikipedia.org/wiki/Standard_deviation#Estimation