我正在使用以下示例中的事件数据集:
Event_Type Event_Timestamp Is_Active
A 2010-10-01 00:00:00 1
B 2010-10-01 00:00:01 1
A 2010-10-01 00:00:02 0
D 2010-10-01 00:00:03 1
B 2010-10-01 00:00:04 0
C 2010-10-01 00:00:05 1
A 2010-10-01 00:00:06 1
A 2010-10-01 00:00:07 1
A 2010-10-01 00:00:08 0
数据集按事件的时间戳排序,数据随着事件的实时发生而增长。数据集中可以随时包含更多事件类型(不仅限于示例中的 A、B、C、D),并且同一事件类型可以多次出现在表中。Is_Active 布尔字段用作指示事件是否仍处于活动状态 (1) 或不处于活动状态 (0) 的一种方式。
从这个意义上说,我尝试使用 SQL 窗口函数对这些数据进行一些转换。我不一定限于特定的产品或技术,因此请随时告诉您如何解决以下问题。
我想要做的是当它们具有相反的 Is_Active 值时动态配对相同类型的每个事件,然后获取该事件的活动时间。换句话说,给定一个事件 X,我需要在 Is_Active 第一次为 1 时获取它的 Event_Timestamp(Begin_Timestamp),然后使用 Is_Active 1 忽略此事件 X 的其余行,直到我得到 Is_Active 0 ,所以我可以再次获取 Event_Timestamp (End_Timestamp)。然后,当我再次在 Is_Active 列中发现事件 X 为 1 时,我将继续应用此逻辑。
结果表的一个示例是:
Event_Type Begin_Timestamp End_Timestamp Duration
A 2010-10-01 00:00:00 2010-10-01 00:00:02 2 seconds
B 2010-10-01 00:00:01 2010-10-01 00:00:04 3 seconds
D 2010-10-01 00:00:03 null null
C 2010-10-01 00:00:05 null null
A 2010-10-01 00:00:06 2010-10-01 00:00:08 2 seconds
是否有任何窗口函数可以帮助我获取这些事件对,以便我可以计算每个事件的持续时间?
你需要类似的东西
当然,您可以使用一个计算所有窗口值的 CTE 将其组合到查询中。上面的long way是用来解释算法的。
鉴于数据
您的结果将使用一些阶段进行计算(每个阶段都在 CTE 中):
如果您的数据还包含多个结束事件,则必须在案例语句中调整对结束事件的识别。这将产生您在帖子中预期的结果:
不需要任何
Window Function
.你可以用不同的样本数据测试我的脚本,也可以给我性能测试的场景。
事实上你应该提供
Real Table Schema
.