首页 >数据库 >mysql教程 >如何找到具有间隙和岛屿的连续事件的最小和最大时间间隔?

如何找到具有间隙和岛屿的连续事件的最小和最大时间间隔?

Linda Hamilton
Linda Hamilton原创
2024-12-17 21:02:14797浏览

How to Find Minimum and Maximum Time Intervals for Consecutive Events with Gaps and Islands?

查找具有间隙和岛屿的连续行的最小值和最大值

在包含由行表示的事件序列的有序数据集的上下文中在一个表中,任务是确定共享相同事件类型的连续行的最小和最大时间间隔。当处理涉及间隙和岛屿的数据时,就会出现这个问题,使得传统的聚合方法不够用。

理解输入

输入表由以下列组成:

  • 名称:每个的唯一标识符person
  • act:事件类型,“睡眠”或“唤醒”
  • rn:每个人的事件序列中的行号
  • startt:开始时间event
  • endd:事件的结束时间

识别连续组

识别连续的行组对于相同的事件类型,我们计算事件类型的行号与整个行之间的差异编号:

row_number() over (partition by name, act order by rn) as seqnum_na
row_number() over (partition by name order by rn) as seqnum_n

这些新列 seqnum_na 和 seqnum_n 分别表示事件类型的序列号和总体序列号。从 seqnum_n 中减去 seqnum_na 会创建一个新列,该列表示事件类型中每个连续行子集的组编号。

与组编号的聚合

与组编号确定后,我们可以汇总开始时间和结束时间,以找到每个时间的最小值和最大值组:

select name, act, min(startt) as startt, max(endd) as endd
from (select i.*,
             row_number() over (partition by name, act order by rn) as seqnum_na,
             row_number() over (partition by name order by rn) as seqnum_n
      from input i
     ) i
group by (seqnum_n - seqnum_na), name, act;

通过按组编号以及名称和事件类型进行分组,我们可以有效地识别和聚合每个子集中的连续行,从而提供所需的最小和最大时间间隔。

以上是如何找到具有间隙和岛屿的连续事件的最小和最大时间间隔?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn