我有一张这样的桌子,

 event_id |          date          
----------+------------------------
  1703702 | 2013-06-25 07:50:57-04
  3197588 | 2013-06-25 07:51:57-04
 60894420 | 2013-06-25 07:52:57-04
 60894420 | 2013-06-25 07:53:57-04
   183503 | 2013-06-25 07:54:57-04
 63116743 | 2013-06-25 07:55:57-04
 63110451 | 2013-06-25 07:56:57-04
 63116743 | 2013-06-25 07:57:57-04
 63116743 | 2013-06-25 07:58:57-04

我想应用滞后函数,但也需要一个分组,这样我就可以找到任何特定事件之间的时间间隔.

我想要这样的:

SELECT event_id, difference
FROM ( 
  SELECT event_id, date - lag(date) over (order by date) as
  difference FROM table GROUP BY event_id
) t;

然而,我不能使用GROUP BY和LAG函数.我希望得到与以下类似的结果:

63116743, {120, 60}
60894420, {60}
...
...

因此,在第一个id的事件和第二个id的事件之间有一个120秒和60秒的窗口.

有办法做到这一点吗?输出格式并不太重要,只要我最终能将其放入数组中.我用的是Postgres 9.1

推荐答案

WITH diffs as (
    SELECT
        event_id,
        date - lag(date) over (partition BY event_id ORDER BY date) as difference
    FROM
        TABLE
)
SELECT
    event_id,
    array_agg( difference ) as all_diffs
FROM
    diffs
GROUP BY event_id;

应该有用.

Postgresql相关问答推荐

Redis作为postgreSQL嵌套数据的缓存

为什么更新不设置较晚的结束时间?

我想优化查询SQL

Postgres数据库系统已准备好接受连接和docker compose

使用 OpenCypher 和 Apache AGE 在两个顶点之间创建双向关系

如何将两条线几何连接成一条记录?

PostgreSQL:在timestamp::DATE 上创建索引

PG::TRDeadlockDetected:ERROR: deadlock detected

如何从元组列表中 Select 与多列匹配的行?

Postgres 图像未创建数据库

如何将 DELETE 的返回值插入到 postgresql 中的 INSERT 中?

带有双引号的 postgresql COPY 和 CSV 数据

如何判断每个组中是否存在值

Select 中的 PostgreSQL 正则表达式捕获组

如何使用 Node.js 和 Postgresql 找到最后一个插入 ID?

如果 PostgreSQL count(*) 总是很慢,如何对复杂查询进行分页?

Postgres:为 CAST 失败定义一个默认值?

使用 Hibernate 注释映射 PostgreSQL 串行类型

在 postgresql 中对使用 array_agg 创建的文本聚合进行排序

如何为 postgres 编写 DELETE CASCADE?