我有一个包含以下记录的表:
| id | coord-x | coord-y | time | --------------------------------- | 1 | 0 | 0 | 123 | | 1 | 0 | 1 | 124 | | 1 | 0 | 3 | 125 |
time
列表示以毫秒为单位的时间。我想要做的是找到所有coord-x
,coord-y
作为给定id
的给定时间范围内的一组点。对于任何给定的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 |
我想要一个与此类似的结果:
| id | points | start-time | end-time | | 1 | (0,0), (0,1), (0,3) | 123 | 125 | | 1 | (0,140), (0,141) | 140 | 141 |
我在我的数据库上安装了PostGIS,上面发布的时间不具代表性,但我将它们保持为小样本,time
只是一个毫秒的时间戳。
答案 0 :(得分: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 |
+---------------------------+--------------+------------+