1

Postgresに関しては、私は少し初心者なので、少し我慢してください。十分な情報を掲載できるかどうかを確認します。

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

私は最後の数時間の雨の列を持っています。もちろん、その数字は(その時間の)現在の合計で変化します。

私がしたいのは、各時間の終わりまで行をすくい取り、その行を取得することですが、過去4時間にわたってそれを行うので、4行しか返されません。

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

これを1つのクエリで実行したいのですが、大騒ぎしません...

ありがとう


あなたの答えに感謝します。

これについてはまだよくわからないので、もう少し詳しく説明してみます。

私は 10 分ごとにデータベースにデータを挿入する ac プログラムを持っています。それは最後の時間の降雨量を保持するデバイスからデータを読み取るので、10 分ごとに x 量だけ上がる可能性があります。したがって、1時間あたり6行のデータがあると思います。私の計画は、7 時間ごとに (私の php ページで) 戻り、これが 1 時間ごとの最後のエントリになり、その値を取得することでした。したがって、なぜ私は4行しか必要としないのですか..少し間隔を空けてください!

私のテーブル(測定値)には次のようなデータがあります

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

より良い保管方法にも耳を傾けてください:)皆さんの助けにも感謝します。

4

3 に答える 3

4

あなたは1つのクエリでそれを行うことができるはずです...

次の行に沿って何かをします:

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 ; 

必要なことをしますか?

于 2011-09-13T15:36:50.403 に答える
2

SELECT SUM(降雨量) FROM weatherdata WHERE time > (NOW() - INTERVAL '4 hour' );

列名はわかりませんが、大文字のものはpgsql型です。それはあなたが求めているものですか?

于 2011-09-13T10:18:58.917 に答える
1

これがまさにあなたが探しているものかどうかはわかりませんが、適応の基礎として役立つかもしれません. 私はエポック時間を使用していませんが、時間の経過とともに要約データを生成する必要があることが多いため、私が思いついたよりも値を操作するより良い方法があるかもしれません。

テスト テーブルの作成と入力

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;

次に、 hour に切り捨てます。

select to_char(timestamptz 'epoch' + etime * '1 second'::interval,
               'yyyy-mm-dd hh24:00:00')::timestamptz  from epoch_t

時間ごとの要約情報を提供するには:

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;

データにギャップがある可能性があるが、ゼロの結果を報告する必要がある場合は、generate_series を使用して期間バケットを作成し、データ テーブルに左結合します。この場合、6 時間ではなく 9 時間以上のデータ ポピュレーションの前にサンプル時間バケットを作成し、エポック時間から時間に切り捨てられたタイムスタンプへの変換に参加します。

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;
于 2011-09-13T14:16:48.577 に答える