我的Postgres
查询从一堆传感器读数中计算统计aggregate
:
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;
只要我有
>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
然后所有三个统计信息均正确计算。因此,我得出的结论是,非法
STDDEV
会使整个查询失败。我宁愿非法的STDDEV返回0。我试图COALESCE
STDDEV
行,但无济于事。可以做什么???
我的Postgres查询从一堆传感器读数中计算统计汇总:SELECT to_char(ipstimestamp,'YYYYMMDDHH24')作为row_name,to_char(ipstimestamp,'FMDD mon FMHH24h')作为...
stddev_pop
,而不是“样本标准偏差” stddev_samp
;后者除以n-1
,并别名为STDDEV
。取而代之的是stddev_pop
除以n
,并且在给定一个样本时返回零(而不是NULL
)。