読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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の値が一軒ずつとれるようになります。