2012-06-26 4 views
3

내 포스트 그레스 쿼리는 센서 판독 값의 무리에서 통계 집계를 계산합니다포스트 그레스 집계 동작을 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는 Postgres 오류없이 NULL을 반환합니다.

나는 다음과 같이 STTDEV을 주석 경우

은 :

(AVG(ipsvalue)::NUMERIC(5,2)) ||', ' || 
(MAX(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' || 
(MIN(ipsvalue)::NUMERIC(5,2))::TEXT ||', ' As value 

다음 세 가지 통계가 제대로 계산됩니다. 따라서 나는 불법적 인 STDDEV가 전체 질의를 야기한다고 결론을 내린다. 차라리 0을 반환하는 불법 STDDEV가 있습니다. STDDEV 행을 COALESCE하려고 시도했지만 아무 소용이 없습니다. 할 수있는 일은 무엇입니까 ???

+2

어떻게 '합병'을 했습니까? 이것은 작동합니다 :'(coalesce (STDDEV (ipsvalue), 0) :: 숫자 (5,2)) :: TEXT' –

+0

Clodoaldo, 많은 감사 !!! 구문을 시험해 보았는데 예상대로 작동합니다! 분명히 나는 ​​COALESCE 문법을 엉망으로 만들었고, 콜론이 너무 많았고, 숫자와 텍스트 사이의 변환이 너무 많았다. – aag

답변

5

COALESCE.

또한 사용할 수 있습니다 (그것은 당신을 맞)은 "population standard deviatio N"stddev_pop 대신 stddev_samp "샘플 표준 편차"의; 나중에는 n-1으로 나뉘며 별칭은 STDDEV입니다. 대신 stddev_popn으로 나누고 하나의 샘플이 제공되면 0을 반환합니다 (NULL 대신).

당신이이 추정량의 차이를 알 수없는 경우

, 그것은 예를 들어 http://en.wikipedia.org/wiki/Standard_deviation#Estimation

+0

Leonbloy, 정말로 많은 도움에 감사드립니다. 귀하의 설명은 매우 명확하고 도움이됩니다. 시간을내어 주셔서 감사합니다. 결국 COALESCE가 작동하도록했습니다 (위 참조). – aag

0

나는 합체 대안입니다 해결 방법을 발견, 모든 통계 교과서에서 설명합니다. 내 구체적인 사례에서 COALESCE는 더 잘 수행 될 수 있지만 해결 방법은 잠재적으로보다 유연합니다.

나는 IIF simulation described by Emanuel Calvo Franco and Hector de los Santos을 이용했다. IIF는 MS Access의 동족체와 거의 유사합니다. 내 경우, IIF 함수는 NULL에 대한 STDDEV의 결과를 테스트하고 참이면 "0"을 리턴합니다. IIF에 대한 좋은 점은 NULL뿐만 아니라 모든 종류의 조건을 테스트 할 수 있다는 것입니다.