2016-10-11 32 views
1

間隔で統計分析を実行する必要があります。つまり、テーブル内の2つのdatetimeフィールド間の差です。Postgres:日付時間間隔での統計関数

集合関数のドキュメントhereによると、集計 は、MAXMINAVGなどの関数です。つまり、一般集計関数は、日付と時間のフィールドの引数を受け入れます。

stddev_pop,var_pop,var_samおよびstd_sampなどの高度な統計関数の場合、サポートされている入力は数値または類似しているようです。ドキュメントは

...(これらは 、より一般的に使用される骨材のリストを乱雑に避けるために、単に分離されている。)...

2種類の機能に違いはありません示唆しているが

これらのパラメータを簡単に計算する方法はありますか?引数としてinterval型がサポートされないのはなぜですか?これらのタイプの統計集計関数は単位不変であるか?

P.S.私はエポックを抽出して使用することができないと確信しています。

+1

2つの日時フィールドの違いは、数値として私を打ちます。 –

+0

それは私も考えたものですが、違いは日付タイプの間隔であり、これらの関数は間隔の入力を受け付けませんが、平均は私には意味がありません。 – Manquer

+1

@DanBracuk 2つのタイムスタンプの違いは「間隔」 –

答えて

1

私がコメントで述べたように、サンプルの標準偏差を手動で調整するには、ある時点で間隔を間隔で掛けます。 PostgreSQLはこれをサポートしていません。

この問題を回避するには、間隔を時間または分または秒(または何でも)に短縮します。これは計算を手動で行うよりもずっと簡単で、PostgreSQLがこの種の計算をサポートしていない理由を示唆しています。

まず、PostgreSQL general mailing list

CREATE OR REPLACE FUNCTION interval_to_seconds(interval) 
RETURNS double precision AS $$ 
    SELECT (extract(days from $1) * 86400) 
     + (extract(hours from $1) * 3600) 
     + (extract(minutes from $1) * 60) 
     + extract(seconds from $1); 
$$ LANGUAGE SQL; 

からの機能は今、私たちは、間隔の簡単なセットの標準偏差を取ることができます。

with intervals (i) as (
    values (interval '1 hour'), (interval '2 hour'), (interval '3 hour'), 
     (interval '4 hour'), (interval '5 hour') 
) 
, intervals_as_seconds as (
    select interval_to_seconds(i) as seconds 
    from intervals 
) 
select stddev(seconds), stddev(seconds)/60 
from intervals_as_seconds 
 
in_sec    in_min 
double precision double precision 
-- 
5692.09978830308 94.8683298050514 

あなたが好きしかし、結果を確認することができます。

ここで、秒単位ではなく時間単位を指定したいとします。明らかに、粒度の選択は高度にアプリケーションに依存します。別の関数、interval_to_hours(interval)を定義することもできます。非常に似たクエリを使用して、標準偏差を計算することができます。

with intervals (i) as (
    values (interval '1 hour'), (interval '2 hour'), (interval '3 hour'), 
     (interval '4 hour'), (interval '5 hour') 
) 
, intervals_as_hours as (
    select interval_to_hours(i) as hours 
    from intervals 
) 
select stddev(hours) as stddev_in_hrs 
from intervals_as_hours 
 
stddev_in_hrs 
double precision 
-- 
1.58113883008419 

時間における標準偏差の値は、分または秒の値とは明らかに異なります。しかし、彼らはまったく同じことを測定します。重要な点は、「正しい」答えは、使用したい粒度(単位)に依存し、多くの選択肢があることです。 (マイクロ秒から何世紀にもわたる)想像してみてください。

select interval_to_hours(interval '45 minutes') 
 
interval_to_hours 
double precision 
-- 
0 

ことは、正しい答えますか?あなたは言うことができません。正しい答えはアプリケーションに依存します。 45分を1時間と見なすアプリケーションを想像することができます。私はまた、いくつかのの計算では1時間と見なされ、の場合には0時間として他のの計算では45分が必要と思われるアプリケーションを想像することもできます。

この質問について考えてみましょう。 1ヵ月に何秒ありますか?式select interval '1' month;が有効です。秒数は月に何日あるかによって異なります。

私はだと思っています。それはだと思うのですが、PostgreSQLはこの種の計算をサポートしていません。インターバル引数でそれを行う正しい方法はアプリケーションにも依存します。

後で。 。 。

この記事は、PostgreSQLのメーリングリストの1つで見つかりました。

No stddev() for interval?

+1

独自の 'interval_to_seconds()'を書く必要はありません。これは詳細な説明のために 'extract(epoch from ...)' –

+0

thxを使って行うことができます。メーリングリストのスレッドはGoogle検索になっていましたが、どうしてこのようなハックが必要なのかわかりませんでした。異なる単位は、時間が標準の10進変換ではないので特に変化します。私はおそらく秒を言うことができると仮定していますが、そうすることは望ましくないかもしれません。 – Manquer

+0

私はそれをテストすることはできませんが、結果を秒単位で計算しようとするかもしれません。私はこれをTeradataで使います: 'stddev(秒)* interval '0000 00:00:00' second' – dnoeth

関連する問題