4

我的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/hourCOUNT(ipsvalue)<2但是,如果 hourlyStatisticsValue返回时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。我尝试了COALESCESTDDEV条线,但无济于事。可以做什么???

4

2 回答 2

6

COALESCE应该管用。

您也可以使用(适合您的)“总体标准差stddev_pop,而不是“样本标准差” stddev_samp;后者除以n-1并别名为STDDEVstddev_pop, 相反, 除以, 并且在给定一个样本时n返回零(而不是)。NULL

如果您不知道这些估计器之间的区别,则在每本统计教科书中都有解释,例如http://en.wikipedia.org/wiki/Standard_deviation#Estimation

于 2012-06-26T19:43:41.927 回答
0

我找到了一种替代 COALESCE 的解决方法。在我的具体实例中,COALESCE 可能会表现得更好,但解决方法可能更灵活。

我利用了Emanuel Calvo Franco 和 Hector de los Santos 描述的 IIF 模拟。IIF 的工作方式与 MS Access 中的同源物非常相似。在我的实例中,IIF 函数测试 STDDEV 的结果是否为 NULL,如果为真则返回“0”。IIF 的好处是它可以测试各种条件,而不仅仅是 NULL。

于 2012-06-27T10:38:21.160 回答