首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用postgres查找成对的事件?

如何使用postgres查找成对的事件?
EN

Stack Overflow用户
提问于 2018-06-01 18:43:27
回答 2查看 113关注 0票数 0

我有一个事件表:

代码语言:javascript
复制
             ts             |  user  | reason 
----------------------------+--------+--------
 2018-06-01 10:44:15.52+01  | 359999 | START
 2018-06-01 10:44:29.521+01 | 359999 | STOP
 2018-06-01 10:44:43.52+01  | 359998 | START
 2018-06-01 10:44:55.52+01  | 359999 | START
 2018-06-01 10:44:59.521+01 | 359998 | STOP
 2018-06-01 10:45:07.52+01  | 359999 | STOP
 2018-06-01 10:46:16.52+01  | 359999 | START

我想找出成对的事件:

代码语言:javascript
复制
  user  |           start            |            stop            
--------+----------------------------+----------------------------
 359999 | 2018-06-01 10:44:15.52+01  | 2018-06-01 10:44:29.521+01
 359998 | 2018-06-01 10:44:43.52+01  | 2018-06-01 10:44:59.521+01
 359999 | 2018-06-01 10:44:55.52+01  | 2018-06-01 10:45:07.52+01
 359999 | 2018-06-01 10:46:16.52+01  |

什么样的查询可以做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-14 06:00:57

使用window function可以很容易地做到这一点。除了其他功能之外,它们还允许您引用查询结果中的下一行/上一行(通过lead()lag())。例如:

代码语言:javascript
复制
SELECT "user", ts AS start, next_ts AS stop
FROM (
  SELECT *, lead(ts) OVER (PARTITION BY "user" ORDER BY ts) AS next_ts
  FROM events
  WHERE reason IN ('START', 'STOP')
) AS ts_pairs
WHERE reason = 'START'
票数 1
EN

Stack Overflow用户

发布于 2018-06-01 18:45:14

我刚把它弄好。有没有更有效的方法?

代码语言:javascript
复制
select imei, reason, ts AS start, (
    select ts
    from events as stops
    where stops.ts > starts.ts
    and reason = 'STOP'
    and stops.user = starts.user
    order by ts desc
    limit 1
) as stop
from events as starts
where reason = 'START'
order by ts
;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50641682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档