2012-06-26 1 views
3

мой 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, но безрезультатно. Что может быть сделано???

+2

Как вы использовали 'coalesce'? Это должно работать: '(coalesce (STDDEV (ipsvalue), 0) :: NUMERIC (5,2)) :: TEXT' –

+0

Clodoaldo, огромное спасибо !!! Я пробовал ваш синтаксис, и действительно он работает так, как ожидалось! По-видимому, я испортил синтаксис COALESCE, у меня было слишком много двоеточий и слишком много преобразований из числа в текст и обратно! – aag

ответ

5

COALESCE должно работать.

Вы также можете использовать (то, что подходит вам) «population standard deviatiostddev_pop, вместо «стандартного отклонения образца» stddev_samp; более поздняя часть делится на n-1 и имеет псевдоним STDDEV. stddev_pop, вместо этого делит на n, и возвращает 0 (вместо NULL) при получении одного образца.

Если вы не знаете разницу между этими оценками, это объясняется в каждом учебнике статистики, например http://en.wikipedia.org/wiki/Standard_deviation#Estimation

+0

Leonbloy, большое спасибо за вашу помощь. Ваши объяснения очень ясны и полезны. Я ценю ваше время, чтобы провести меня через это! В итоге мне удалось заставить COALESCE работать (см. Выше). – aag

0

Я нашел обходной путь, который является альтернативой COALESCE. В моем конкретном случае COALESCE, скорее всего, будет работать лучше, но обходной путь потенциально более гибкий.

Я воспользовался IIF simulation described by Emanuel Calvo Franco and Hector de los Santos. IIF работает почти как его гомолог в MS Access. В моем случае функция IIF проверяет результат STDDEV на NULL и возвращает «0», если true. Хорошая вещь о IIF заключается в том, что он может тестировать всевозможные условия, а не только NULL.

Смежные вопросы