мой Postgres запрос вычисляет статистические агрегаты с кучей показаний датчиков:Postgres STDDEV совокупное поведение при п <2
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/час. Однако если почасовое значение 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 сбрасывает весь запрос. Я предпочел бы, чтобы неработающие STDDEVs возвращались 0. Я попытался выполнить COALESCE строку STDDEV, но безрезультатно. Что может быть сделано???
Как вы использовали 'coalesce'? Это должно работать: '(coalesce (STDDEV (ipsvalue), 0) :: NUMERIC (5,2)) :: TEXT' –
Clodoaldo, огромное спасибо !!! Я пробовал ваш синтаксис, и действительно он работает так, как ожидалось! По-видимому, я испортил синтаксис COALESCE, у меня было слишком много двоеточий и слишком много преобразований из числа в текст и обратно! – aag