根据时间字段将postgres记录分组

时间:2017-09-06 00:55:29

标签: postgresql

我有一个包含以下记录的表:

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

time列表示以毫秒为单位的时间。我想要做的是找到所有coord-xcoord-y作为给定id的给定时间范围内的一组点。对于任何给定的id,都有一个唯一的coord-xcoord-ytime

然而,我需要做的是将这些点分组,只要它们相隔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只是一个毫秒的时间戳。

1 个答案:

答案 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 |
+---------------------------+--------------+------------+