n <2]时的Postgres STDDEV聚合行为>

问题描述 投票:4回答:2

我的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')作为...

postgresql null statistics aggregate standard-deviation
2个回答
6
投票
您也可以使用(适合您)“population standard deviation” stddev_pop,而不是“样本标准偏差” stddev_samp;后者除以n-1,并别名为STDDEV。取而代之的是stddev_pop除以​​n,并且在给定一个样本时返回零(而不是NULL)。

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.