2017-09-06 3 views
1

私は次のようになり、レコードを持つテーブルを持っている:Postgresのレコードが

 
| id | coord-x | coord-y | time | 
--------------------------------- 
| 1 |  0 |  0 | 123 | 
| 1 |  0 |  1 | 124 | 
| 1 |  0 |  3 | 125 | 

time列はミリ秒単位の時間を表しています。私がしたいことは、idの与えられた時間枠の点の集合としてすべてcoord-xcoord-yを見つけることです。任意の与えられたidには、ユニークなcoord-x,coord-yおよびtimeがある。

ただし、私がする必要があるのは、nミリ秒離れている限り、これらのポイントをグループ化することです。

 
| id | coord-x | coord-y | time | 
--------------------------------- 
| 1 |  0 |  0 | 123 | 
| 1 |  0 |  1 | 124 | 
| 1 |  0 |  3 | 125 | 
| 1 |  0 |  6 | 140 | 
| 1 |  0 |  7 | 141 | 

が、私はこれと同様の結果たい:私は、これは持っているのであれば、私はPostGISのが私のデータベースにインストールしなければならないの

 
| id | points    | start-time | end-time | 
| 1 | (0,0), (0,1), (0,3) |  123 |  125 | 
| 1 | (0,140), (0,141) |  140 |  141 | 

を、私は上記の投稿時間は、代表ではありませんが、私はそれらを保持しましたサンプルのように小さくても、timeはちょうどミリ秒のタイムスタンプです。

答えて

0

あなたのGROUP BYの中の表現を選ぶのは難しい部分です。 n = 5の場合は、time/5のようにすることができます。この例を正確に照合するには、次のクエリで(time - 3)/5を使用します。グループにまとめたら、array_aggで配列に集約できます。ここで

SELECT 
    array_agg(("coord-x", "coord-y")) as points, 
    min(time) AS time_start, 
    max(time) AS time_end 
FROM "<your_table>" 
WHERE id = 1 
GROUP BY (time - 3)/5 

は出力

+---------------------------+--------------+------------+ 
| points     | time_start | time_end | 
|---------------------------+--------------+------------| 
| {"(0,0)","(0,1)","(0,3)"} |   123 |  125 | 
| {"(0,6)","(0,7)"}   |   140 |  141 | 
+---------------------------+--------------+------------+ 
ある
関連する問題