postgresqlでのSQL時間ごとのデータ集約


9

私はデータベースの初心者なので、このデータベースについてあなたの助けを求めています。

時系列データを含むテーブルがあります。

2012/01/01 00:10, 10
2012/01/01 00:30, 5
2012/01/01 01:00, 10
2012/01/01 01:40, 10
2012/01/01 02:00, 20

テーブルは、間隔の上限のみを維持することにより、間隔ベースのデータを格納しています。たとえば、最初の行は[00:00-00:10]からの間隔を10の値で表し、2番目の行は(00:10-00:30]からの間隔を5の値で表し、3番目の行は間隔は(00:30-01:00)で、値は10です。

上記のような構造の時間別データを集約するために、Postgresで効率的なクエリが必要です。したがって、結果は次のようになります。

2012/01/01 00:00, 2012/01/01 01:00, 25
2012/01/01 01:00, 2012/01/01 02:00, 30

時系列データは大きいので、これをインデックス付けする際の助けがあれば非常にありがたいです。

ありがとう、ダン


1
たとえば2012/01/01 00:10, 10、サンプルデータでは、これらの値はすべて1つの列に含まれていますか、それともカンマが列の区切り文字ですか?また、正確な時間(午前1時など、午前2時00分、午前3時は、)時系列テーブルに格納することが保証されている、またはそれがスキップ可能性がありますのような00と持つエントリ2012/01/01 03:50が続くの2012/01/01 04:10
dartonw 2014年

ソースデータのない時間が1時間ある場合はどうなりますか?あなたはまだのような出力が必要2012/01/01 04:00, 2012/01/01 05:00, 0ですか?または、その時間は要約から省略されるべきですか?
Joshua Huber 2014年

@dartonw-コンマは列の区切り文字です。したがって、日時と値はテーブル内の異なる列です。正確な時間は常に保存されることが保証されています。
dan

回答:


8
select
  date_trunc('hour', t - interval '1 minute') as interv_start,
  date_trunc('hour', t - interval '1 minute')  + interval '1 hours' as interv_end,
 sum(v)
  from myt 
    group by date_trunc('hour', t - interval '1 minute')
order by interv_start

sqlfiddleを参照してください

インデックスについて:関数インデックスを試すことができますが、date_trunc('hour', t - interval '1 minute')postgresqlがそれを使用できるかどうかはわかりません。


ありがとう、上司は幸せです。ただし、実際の科学に基づいた正確なアプローチが必要な場合は、ウィンドウ関数を操作するために勉強してください。PostgreSQLはそれらをネイティブでサポートしています:no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
ブライアンハーク

賛成です!これが1時間ではなく30分だった場合、どうしますか
PirateApp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.