2011-09-13 6 views
1

にわたり私は初心者のビットですので、私と一緒にちょっぴりを負担し、私は十分な情報を置くことができるならば、私は表示されます。は、postgresのことになるとデータ選択期間

私はエポック日付がスタンプされた時間の列を持って、10分ごとのテーブルに気象データを挿入します。

私は最後の時間の雨の秋の列、およびすべての時間を持っていること(つまり時間)、実行中の合計とコースの数が変化します。私がやりたい何

は言う、各時間の最後に行を脱脂し、その行を取得しますが、最後の4時間にわたってそれを行うので、私は唯一の4行を返すことになるです。

は1つのクエリで、このことは可能ですか?または複数のクエリを行う必要がありますか?

私は1つのクエリではなくfussedないこれを行うしたいと思います...

おかげであなたの答えのための


みんなありがとう、私は/ビットがあなたのギャビンで混乱していた - 申し訳ありません: )これをひどくよく知らないから来ています。

私はデータベースにデータを挿入交流プログラムを持っているが、すべての10分は、それがデータFOMを読み込む。..

は、私はまだこのことについて少しわからないので、私は試してみて、それが少し良く説明します最後の雨が降っても、10分ごとにx量だけ上がる可能性があるデバイスです。 だから、私は6行/時のデータがあると思います。 私の計画は、毎回最後のエントリになる7秒ごとに(私のPHPページで)戻って、その値を取得することでした。それで、なぜ私は4列しか必要としないのでしょうか。

マイテーブル(測定値)は、この

index | time (text) | last hrs rain fall (text) 
1  | 1316069402 | 1.2 

などのデータを格納するより良い方法へのすべての耳があまりにも:)私は非常に、あまりにもみんなのおかげであなたの助けに感謝しています。

+1

so ...最後の行以降の総降雨量ではなく、降雨時の実際の合計を各行に与えていますか?そのようなデータにピリオドを埋め込むことは、他のクエリをはるかに困難にします。その特定のタイムスライスの10分だけ降雨を得るのが難しい場合は、レコーディングを開始してからの総降雨量を記録する方が良いかもしれません。そのデータからタイムスライス降雨量を簡単に導き出すことができるからです。 – SingleNegationElimination

答えて

1

SELECT SUM(rainfall)FROM weatherdataどこの時間>(NOW() - INTERVAL '4時間');

カラム名はわかりませんが、それはすべきです。大文字のものはpgsqlタイプです。それはあなたの後のことですか?

+0

こんにちはダニエル、 私はこのクエリを試しました 時間インデックス>時間(キャスト)(エキスから(NOW() - インターバル '4時間'))テキストとして) しかし、最後の4時間分のデータ(24個の10分サンプル)が返されます...毎時の1つの結果がより多く見つかりました 4:00 pm rowdata1 rowdata1 5:00 pm rowdata1 rowdata1 6:00 pm rowdata1 rowdata1 など... 私はおそらく、データを見つけるために複数のクエリを実行する方が良いと思いますか? –

+0

はい、私は実際には関数とのごみですが、私はpgsqlのドキュメントにあなたを導いてくれるでしょうが、少し機能をつけることができます。ごめんなさい –

0

これがあなたが探しているものであるかどうかはわかりませんが、おそらくそれが適応の基礎として役立つかもしれません。私が出ているよりも、値を操作するより良い方法があるかもしれないので、私はエポックタイムを使用していないのに は、私は多くの場合、時間の期間にわたって集計データを生成するためのrequirmentを持っています。

期間のバケットに時間を分割するには、テストテーブルに

create table epoch_t(etime numeric); 
insert into epoch_t 
select extract(epoch from generate_series(now(),now() - interval '6 hours',interval '-10 minutes')); 

を作成し、移入:

select generate_series(to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz, 
         to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz - interval '4 hours', 
         interval '-1 hour'); 

Postgresのタイムスタンプにエポック時刻に変換:

select timestamptz 'epoch' + etime * '1 second'::interval from epoch_t; 

その後、時間に切り捨てます。

あなたは、データのギャップを持っていますが、ゼロの結果は、期間バケットを作成するためにgenerate_seriesを使用して、データテーブルへの結合を左に報告する必要があります場合は

select to_char(timestamptz 'epoch' + etime * '1 second'::interval, 
       'yyyy-mm-dd hh24:00:00')::timestamptz, 
     count(*) 
    from epoch_t 
group by 1 
order by 1 desc; 

:時間によって要約情報を提供するために、

。 このケースでは、上記のデータ集計より前のサンプル時間バケットを、6ではなく9時間作成し、エポック時間からタイムスタンプが1時間に切り詰められるまで結合します。あなたは1つのクエリでそれを行うことができるはず

select per.sample_hour, 
     sum(case etime is null when true then 0 else 1 end) as etcount 
    from (select generate_series(to_char(now(), 
           'yyyy-mm-dd hh24:00:00')::timestamptz, 
           to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz - interval '9 hours', 
           interval '-1 hour') as sample_hour) as per 
     left join epoch_t on to_char(timestamptz 'epoch' + etime * '1 second'::interval, 
            'yyyy-mm-dd hh24:00:00')::timestamptz = per.sample_hour 
group by per.sample_hour 
order by per.sample_hour desc; 
4

...の線に沿って

なりの何か:

SELECT various_columns, 
    the_hour, 
    SUM (column_to_be_summed) 
FROM (SELECT various_columns, 
      column_to_be_summed, 
      extract (hour FROM TIME) AS the_hour 
     FROM readings 
     WHERE TIME > (NOW() - INTERVAL '4 hour')) a 
GROUP BY various_columns, 
    the_hour ; 

何が必要ですか?

関連する問題