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

kupeojn6  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(105)

我的用户可以采取两种行动:
1.进入房间
1.离开房间
我正在使用Azure流分析,我的目标是创建一个进入房间但在接下来的30分钟内没有离开的用户表。数据具有以下结构:

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

示例数据(事件中心流):
| 用户ID|活动名称|Event_timestamp|
| --|--|--|
| 一|进入房间|2023-09-02 12:00:00|
| B|进入房间|2023-09-02 12:10:00|
| C|进入房间|2023-09-02 12:20:00|
| 一|离开房间|2023-09-02 12:25:00|
| B|离开房间|2023-09-02 12:45:00|
所需输出(输出表):
| 用户ID|活动名称|Event_timestamp|
| --|--|--|
| B|进入房间|2023-09-02 12:10:00|
| C|进入房间|2023-09-02 12:20:00|
我尝试过使用窗口函数的功能,但是除了在FROM子句中定义的时间戳之外,它们不按任何参数分组。它导致创建时间窗口,而不考虑发生了什么事件或谁创建了事件。

xuo3flqw

xuo3flqw1#

您使用下面的查询。

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_timeexit_time放在不同的记录中,并以进入和退出时间之差超过30分钟或为空为条件将它们连接起来。
输出量:

相关问题