我的用户可以执行两项操作:
我正在使用 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 子句中定义的时间戳以外的任何参数进行分组。它会导致创建时间窗口而不考虑发生了什么事件或谁创建了事件。
您使用以下查询。
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分钟或为空为条件。
输出: