sql - 如何计算PostgreSQL中一张表的记录之间的间隔?
问题描述
我的数据示例(表按 createdAt 列排序):
id | eventType | createdAt
----+-----------+----------------------------
1 | login | 2020-03-23 04:05:33.839+00
2 | login | 2020-03-23 07:52:55.684+00
3 | login | 2020-03-23 11:16:01.243+00
4 | login | 2020-03-23 11:34:28.91+00
5 | login | 2020-03-23 12:18:21.451+00
6 | login | 2020-03-23 13:03:54.742+00
7 | logout | 2020-03-23 18:23:26.815+00
8 | login | 2020-03-23 20:36:21.972+00
9 | logout | 2020-03-23 20:59:58.917+00
10 | login | 2020-03-24 04:18:20.432+00
11 | login | 2020-03-24 05:44:47.278+00
12 | logout | 2020-03-24 10:45:15.463+00
13 | logout | 2020-03-24 15:21:55.65+00
14 | logout | 2020-03-24 15:48:31.247+00
15 | login | 2020-03-24 16:33:23.735+00
16 | logout | 2020-03-24 17:07:59.192+00
17 | logout | 2020-03-24 18:15:03.661+00
18 | login | 2020-03-24 18:29:22.68+00
19 | logout | 2020-03-25 01:25:48.345+00
20 | logout | 2020-03-25 03:33:26.909+00
21 | login | 2020-03-25 10:20:54.3+00
如何计算每对登录-注销之间的间隔?
例如。ID为1的记录和ID为7的记录是第一对login-logout。ID为8的记录和ID为9的记录是第二对login-logout,以此类推。
某些登录/注销可能没有配对。
我的 PostgreSQL 版本是 11。
解决方案
像自加入表一样
select t1.id, t2.id from mytable t1
left join mytable t2
on t1.id+1 = t2.id
and t1.eventType = t2.eventType
where t2.id is null
获取有效行为
1
7
8
9
10
12
createdAt
在第二步中减去连续行。
推荐阅读
- java - 尽管使用了 WeakHashMap,但 OutOfMemoryException
- python - 如何删除 Inception 模型的最后一层
- html - H1 在移动设备上消失。我可以强制它始终出现吗?
- ios - 通过向 FCM 单个设备发送通知来反应原生 Firebase iOS 生产无法正常工作
- javascript - 在 useState 的函数中丢失用于更新状态的合成事件
- 2d - 你应该如何在 Vulkan 中更新每帧的纹理?
- c++ - 无法打印字符串的第一个元素
- character - 如何在带有字符*的数据框中搜索单元格?
- html - 为什么我不能把这张图片放在页面的右侧?
- php - 全文搜索 Mysql 不使用 & 符号 Laravel