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

标签 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 只是一个毫秒时间戳。

最佳答案

棘手的部分是在 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/

相关文章:

postgresql - 在 plpgsql 声明 block 中使用\设置变量

postgresql - 如何从命令行停止 (postgres.app) postgres 集群

sql - 具有较小日期范围(结果集)的 PostgreSQL 查询比具有较大日期范围(结果)的查询慢

c# - 用于存储左、上、宽和高的 PostgreSql 矩形数据类型

java - PostgreSQL 提示 : You will need to rewrite or cast the expression. 列 "state"是状态类型,但表达式是字符类型变化

ruby-on-rails - 事件记录查询错误

ruby-on-rails - 如何修复:PG::ConnectionBad: fe_sendauth: 未提供密码

python - PostgreSQL 获取从主键到外键的序列值

ruby-on-rails - 通过 Rails 中的方法进行 SQL 或 AREL 查询

java - 在 nativeQuery 中注入(inject) JSON 参数