Azure Stream ANalytics - 在时间间隔内查找最近的“n”事件

Azure Stream ANalytics - Find Most Recent `n` Events Within Time Interval

我正在使用 Azure 流分析,为了说明我的情况,我有与来自一定数量用户的买入 (+)/卖出 (-) 订单相对应的流事件。因此,单个事件中的关键字段如下所示:{UserId: 'u12345', Type: 'Buy', Amt: 14.0}.

我想编写一个查询,输出 UserIdAmt 的总和,用于按 [=11 划分的 24 小时滑动周期内的最近(最多)5 个事件=].

澄清一下:

  1. 如果在过去 24 小时内给定 UserId 的事件超过 5 个,我只想要最近 5 个 Amt 的总和。
  2. 如果事件少于 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 BYCAST 在我自己的时间戳上,在你的情况下你可能不需要它。

接下来我们需要解压缩收集的记录,这是通过 CROSS APPLY GetArrayElements 完成的,并对它们求和。我为此使用 snapshot window,因为我不需要对那个进行时间分组。

如果您需要更多详细信息,请告诉我。