2017-01-25 22 views
0

私は時系列データを格納するためにpostgres(RDS)を使用しています。Postgresqlの時系列間隔

  • タイムスタンプ:(インデックスとパーティションキー)
  • ソース:整数インデックス
  • データ:バイナリJSONに含まれるデータ

のは、私のデータは次のようになりましょう

timestamp   | source | data 
---------------------+----------+------------------ 
2017-01-24 19:24:41 | 1  | { some jsonb } 
2017-01-24 19:25:41 | 1  | { some jsonb } 
2017-01-24 19:25:41 | 2  | { some jsonb } 
2017-01-24 19:26:41 | 3  | { some jsonb } 
2017-01-24 19:32:41 | 1  | { some jsonb } 
2017-01-24 19:33:41 | 2  | { some jsonb } 
2017-01-24 19:45:41 | 3  | { some jsonb } 
2017-01-24 19:50:41 | 1  | { some jsonb } 
2017-01-24 19:56:41 | 1  | { some jsonb } 
2017-01-24 20:01:41 | 1  | { some jsonb } 

データをsourceでソートし、間隔で分割したデータを15分間隔で分割するとします。 round私はまた、それを時間間隔に分割する時間を望みます。

は、これまでのところ私は、問題は、私はまだ、各区間のための複数の結果を得ているということです

fifteen_minutes  | source | data 
---------------------+----------+------------------ 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:30:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 20:00:00 | 1  | { some jsonb } 

を返す

SELECT date_trunc('hour', timestamp) + date_part('minute', timestamp)::int/15 * interval '15 min' AS fifteen_minutes, data 
FROM MY_TABLE 
where source=1 
GROUP BY data, fifteen_minutes 
ORDER BY fifteen_minutes desc 

を得ました。私は間隔によってdistinctしたいと最も近いタイムスタンプ

になるだろう理想的には私が取得したいと思います:(間隔ごとの単一の結果)

fifteen_minutes  | source | data 
---------------------+----------+------------------ 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:30:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 20:00:00 | 1  | { some jsonb } 

どれより良いアイデアを? ありがとう!

+1

上記のデータに基づいて予想される出力を投稿してください – GurV

+2

1つのソースと15分間のバケットについて、どのような値を「データ」から使用するかはどのように決定しますか? –

+0

「017-01-24 19:24:41」または「2017-01-24 19:25:41」=>「19:24:41」から「 」の「最も近い」値は19: 15。 現在、コードはこのロジックをマップによって処理しています。結果を減らす –

答えて

1
select distinct on (fifteen_minutes, source) 
    fifteen_minutes, source, data 
from (
    select 
     to_timestamp((extract(epoch from timestamp)/(15 * 60))::int * 15 * 60) as fifteen_minutes, 
     data, timestamp 
    from t 
) t 
order by 
    fifteen_minutes, source, 
    abs(extract(epoch from timestamp) - extract(epoch from fifteen_minutes)) 
+0

ありがとう!!!! Clodoaldo Neto !!! –

関連する問題