かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Stream AnalyticsのCollectTop関数の罠?

ちょっとはまったことがあったのでメモです。

Stream Analyticsには、指定した並び順で並び替えたTopいくつかを返すCollectTop関数というものがあります。

CollectTOP

こいつでCollectTop(1)とかやって一番上の1件だけ取ろうと目論んでたら同率一位が複数件あると複数件かえしてくれましたorz ということで、絶対1件ほしいときはCollectTopに指定する並び順を絶対に1つだけになるように気を付けないといけないなということを学んだ今日この頃でした。

どうしても1つ、以下のようにArrayIndexで0番目にきたものだけにWHEREで絞るのも手です。

[
    {
        "id": 1,
        "value": 10,
        "time": "2015-09-01T15:00:00.0000000Z"
    },
    {
        "id": 1,
        "value": 10,
        "time": "2015-09-01T15:00:00.0000000Z"
    },
    {
        "id": 12,
        "value": 10,
        "time": "2015-09-01T15:00:00.0000000Z"
    },
]

こんなInputに対して

WITH Step1 AS (
    SELECT
        CollectTop(1) OVER(ORDER BY value) AS Tops
    FROM
        Input TIMESTAMP BY Time
    GROUP BY TumblingWindow(second, 1), id
)
SELECT
    flat.ArrayValue.Value.id,
    flat.ArrayValue.Value.value,
    flat.ArrayValue.Value.time
FROM
    Step1 s1 CROSS APPLY GetElements(s1.Tops) AS flat
WHERE
    flat.ArrayIndex = 0

こんなクエリで、id:1とid:12の値が一軒ずつとれるようになります。