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ただし、hourlyがPostgres エラーなしでStatisticsValue返される場合。NULL

次のように をコメントアウトするSTTDEVと、次のようになります。

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

その後、3 つの統計情報がすべて正しく計算されます。STDDEVしたがって、私は、不法行為はクエリ全体を無効にすると結論付けています。私はむしろ不正な STDDEV が 0 を返すことを望んでいCOALESCEますSTDDEV。何ができる?

4

2 に答える 2

6

COALESCE動作するはずです。

「サンプル標準偏差」の代わりに「母集団標準偏差」を使用することもできます。後者は で除算され、 にエイリアスされます。 、代わりに で除算し、 1 つのサンプルを指定すると ( ではなく) ゼロを返します。stddev_popstddev_sampn-1STDDEVstddev_popnNULL

これらの推定量の違いがわからない場合は、すべての統計の教科書で説明されています。たとえば、 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 に答える