Azure Stream ANalytics - 在时间间隔内查找最近的“n”事件
Azure Stream ANalytics - Find Most Recent `n` Events Within Time Interval
我正在使用 Azure 流分析,为了说明我的情况,我有与来自一定数量用户的买入 (+)/卖出 (-) 订单相对应的流事件。因此,单个事件中的关键字段如下所示:{UserId: 'u12345', Type: 'Buy', Amt: 14.0}
.
我想编写一个查询,输出 UserId
和 Amt
的总和,用于按 [=11 划分的 24 小时滑动周期内的最近(最多)5 个事件=].
澄清一下:
- 如果在过去 24 小时内给定
UserId
的事件超过 5 个,我只想要最近 5 个 Amt
的总和。
- 如果事件少于 5 个,我要么希望省略
UserId
,要么将确实存在的事件的 Amt
相加。
我试过查看 LIMIT DURATION
谓词,但似乎没有办法限制事件的数量以及在 PARTITION
时按时过滤 UserId
。有人做过这样的事吗?
考虑到评论,我认为这应该可行:
WITH Last5 AS (
SELECT
UserId,
System.Timestamp() AS windowEnd,
COLLECTTOP(5) OVER (ORDER BY CAST(EventEnqueuedUtcTime AS DATETIME) DESC) AS Top5
FROM input1
TIMESTAMP BY EventEnqueuedUtcTime
GROUP BY
SlidingWindow(hour,24),
UserId
HAVING COUNT(*) >= 5 --We want at least 5
)
SELECT
L.UserId,
System.Timestamp() AS ts,
SUM(C.ArrayValue.value.Amt) AS sumAmt
INTO myOutput
FROM Last5 AS L
CROSS APPLY GetArrayElements(L.Top5) AS C
GROUP BY
System.Timestamp(), --Snapshot window
L.UserId
我们用一个CTE先得到24h的滑动window。在那里,我们都进行过滤以仅保留超过 5 条记录的 windows (HAVING COUNT(*) > 5
),并且仅收集其中的最后 5 条 (COLLECTOP(5) OVER...
)。请注意,在测试查询时,我必须 TIMESTAMP BY
和 CAST
在我自己的时间戳上,在你的情况下你可能不需要它。
接下来我们需要解压缩收集的记录,这是通过 CROSS APPLY GetArrayElements
完成的,并对它们求和。我为此使用 snapshot window,因为我不需要对那个进行时间分组。
如果您需要更多详细信息,请告诉我。
我正在使用 Azure 流分析,为了说明我的情况,我有与来自一定数量用户的买入 (+)/卖出 (-) 订单相对应的流事件。因此,单个事件中的关键字段如下所示:{UserId: 'u12345', Type: 'Buy', Amt: 14.0}
.
我想编写一个查询,输出 UserId
和 Amt
的总和,用于按 [=11 划分的 24 小时滑动周期内的最近(最多)5 个事件=].
澄清一下:
- 如果在过去 24 小时内给定
UserId
的事件超过 5 个,我只想要最近 5 个Amt
的总和。 - 如果事件少于 5 个,我要么希望省略
UserId
,要么将确实存在的事件的Amt
相加。
我试过查看 LIMIT DURATION
谓词,但似乎没有办法限制事件的数量以及在 PARTITION
时按时过滤 UserId
。有人做过这样的事吗?
考虑到评论,我认为这应该可行:
WITH Last5 AS (
SELECT
UserId,
System.Timestamp() AS windowEnd,
COLLECTTOP(5) OVER (ORDER BY CAST(EventEnqueuedUtcTime AS DATETIME) DESC) AS Top5
FROM input1
TIMESTAMP BY EventEnqueuedUtcTime
GROUP BY
SlidingWindow(hour,24),
UserId
HAVING COUNT(*) >= 5 --We want at least 5
)
SELECT
L.UserId,
System.Timestamp() AS ts,
SUM(C.ArrayValue.value.Amt) AS sumAmt
INTO myOutput
FROM Last5 AS L
CROSS APPLY GetArrayElements(L.Top5) AS C
GROUP BY
System.Timestamp(), --Snapshot window
L.UserId
我们用一个CTE先得到24h的滑动window。在那里,我们都进行过滤以仅保留超过 5 条记录的 windows (HAVING COUNT(*) > 5
),并且仅收集其中的最后 5 条 (COLLECTOP(5) OVER...
)。请注意,在测试查询时,我必须 TIMESTAMP BY
和 CAST
在我自己的时间戳上,在你的情况下你可能不需要它。
接下来我们需要解压缩收集的记录,这是通过 CROSS APPLY GetArrayElements
完成的,并对它们求和。我为此使用 snapshot window,因为我不需要对那个进行时间分组。
如果您需要更多详细信息,请告诉我。