我的 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
行,无济于事。可以做什么???
最佳答案
COALESCE
应该有效。
您也可以使用(适合您的)“population standard deviatio n”stddev_pop
,而不是“sample standard deviation”stddev_samp
;后者除以 n-1
并别名为 STDDEV
。相反,stddev_pop
除以 n
,并在给定一个样本时返回零(而不是 NULL
)。
如果您不知道这些估计量之间的区别,在每本统计教科书中都有解释,例如 http://en.wikipedia.org/wiki/Standard_deviation#Estimation
关于postgresql - 当 n<2 时,postgres STDDEV 聚合行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214732/