sql - 表中两个事件之间的时间差(SQL)
问题描述
假设我有一张桌子
ID | 事件 | 时间 |
---|---|---|
1 | 事件1 | 3:30 |
1 | 事件2 | 3:30 |
3 | 事件1 | 3:35 |
1 | 事件3 | 3:40 |
3 | 事件3 | 3:50 |
1 | 事件1 | 3:55 |
1 | 事件3 | 3:56 |
现在这些事件一次又一次地发生。我想编写和 sql 查询来计算每个 id 的两个不同事件之间的所有时间差。例如,如果我必须为每个 id 计算 event3 的当前时间与 event1 的最近一次时间之间的所有时间差。预期的结果是。
ID | 事件1次 | 事件3时间 | 区别 |
---|---|---|---|
1 | 3:30 | 3:40 | 10 |
3 | 3:35 | 3:50 | 15 |
1 | 3:55 | 3:56 | 1 |
这些事件将一次又一次地发生,并且该表可以包含两个事件之间的 n 个其他事件。对于 event3 发生的所有时间,我想找到 event1 发生的最近时间,然后计算两者之间的差异(按 id 分区)。
类比 - 这可以与事务数据库进行比较,其中事件是特定人员(id)的事务事件。我想要一张表格,给出该特定人发生的所有两次事件(例如收到的金额、支付的金额)之间的时间差。
我将在 spark 上运行此查询,因为我的数据很大,因此我想避免连接。我可以为此使用窗口函数(lag,last_value)等吗?我在为当前事件 3 选择上一个事件 1 时遇到问题。
解决方案
您确实可以使用lag
,但请记住,这仅适用于每个event3
只有一对配对,event1
否则此查询将中断。所以会有更好的解决方案,但仅针对这种情况:
select id,l_time event1time,time event3time,(time-l_time) as diff from (
select id,event,
lag(event) over(partition by id order by time) l_event,
time,
lag(time)over(partition by id order by time) l_time
from [table]
where event in('event1','event3') )a
where event = 'event3' and l_event = 'event1'
同样在我用于时间列的伪数据int
中,因此可能会稍作调整以获得时差。
这是db<>fiddle以便更好地检查。
推荐阅读
- ios - 当用户从 iPhone 的控制中心使用屏幕录制工具时,如何暂停特定屏幕的屏幕录制
- regex - Perl 中的 qr/ 和 m/ 有什么区别?
- java - 为什么要明确定义 KafkaTemplate bean?
- python-3.x - 升级到 Python 3.8.5 后所有模块都不可用
- javascript - 如何在各种屏幕尺寸上保持绝对 Touchables 一致?
- node.js - 使用 mineflayer 进行节点 JS 的 Minecraft 机器人错误
- javascript - CSS 网格不工作。当我在 Chrome 中检查时,代码都没有显示
- r - 将记录移动到R中的不同列和行
- laravel - Laravel Eloquent WhereHas 查询联合后
- c++ - C++ 中的当前 UTC 时间点