如何在流分析中的 FROM 子句中不仅仅基于 TIMESTAMP 创建时间窗口?

问题描述 投票:0回答:1

我的用户可以执行两项操作:

  1. 进入房间
  2. 离开房间

我正在使用 Azure 流分析,我的目标是创建一个在接下来的 30 分钟内进入房间但未离开房间的用户表。 数据具有以下结构:

{
user_id: 'user_id',
event_name: 'Enter the room' | 'Leave the room',
event_timestamp: 'yyyy-mm-dd hh:mi:ss'
}

示例数据(事件中心流):

用户_id 活动_名称 事件_时间戳
A 进入房间 2023-09-02 12:00:00
B 进入房间 2023-09-02 12:10:00
C 进入房间 2023-09-02 12:20:00
A 离开房间 2023-09-02 12:25:00
B 离开房间 2023-09-02 12:45:00

期望输出(输出表):

用户_id 活动_名称 事件_时间戳
B 进入房间 2023-09-02 12:10:00
C 进入房间 2023-09-02 12:20:00

我尝试使用窗口函数的功能,但它们不按 FROM 子句中定义的时间戳以外的任何参数进行分组。它会导致创建时间窗口而不考虑发生了什么事件或谁创建了事件。

azure azure-eventhub azure-stream-analytics
1个回答
0
投票

您使用以下查询。

WITH enter_room AS  (
SELECT
    user_id,
    try_cast(event_timestamp as datetime)  as entry_time,
    event_name
FROM
    inputdata
WHERE
    event_name =  'Enter the room'
),

leave_room AS  (
SELECT
    user_id,
    try_cast(event_timestamp as datetime)  AS exit_time,
    event_name
FROM
    inputdata
WHERE
event_name =  'Leave the room'
)


SELECT
    e.user_id,
    e.event_name,
    e.entry_time as event_timestamp
into outdata
FROM enter_room e
left  JOIN leave_room l
ON e.user_id = l.user_id
AND
DATEDIFF(minute, e, l)  BETWEEN 0 AND 30
WHERE DATEDIFF(minute,e.entry_time,l.exit_time)  > 30 or  DATEDIFF(minute,e.entry_time,l.exit_time)  is  NULL;

这里,我把

entry_time
exit_time
分开了 记录并加入,以进出时间差超过30分钟或为空为条件。

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.