我有一个包含如下记录的表:
| 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
只是一个毫秒时间戳。
最佳答案
棘手的部分是在 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 |
+---------------------------+--------------+------------+
关于postgresql - 根据时间字段将 postgres 记录分成组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46065254/