Окно моментального снимка (Azure Stream Analytics)

Окна моментального снимка группируют события с одинаковой меткой времени. В отличие от других типов окон, для которых требуется определенная функция окна (например, SessionWindow()), окно моментального снимка можно применить, добавив System.Timestamp() в предложение GROUP BY.

На следующей схеме показан поток с рядом событий и их сопоставление с snapshot окнами.

Диаграмма окна моментального снимка

System.Timestamp() можно рассматривать в предложении GROUP BY как ключевой столбец или определение snapshot окна, так как оно группирует события в окно на основе равенства меток времени. В сочетании с другой оконной функцией System.Timestamp() обрабатывается как ключ, а не как определение окна. System.Timestamp() не выдает ошибку при использовании с другими оконными функциями в отличие от нескольких оконных функций, используемых в предложении GROUP BY. Использование system.Timestamp() и функции window в GROUP BY может быть полезно для пакетной обработки результатов.

Любое выражение, содержащее System.Timestamp(), не считается окном. Например, GROUP BY DATEPART(minute, System.Timestamp()) происходит сбой с ошибкой "необходимо указать окно".

Синтаксис

System.Timestamp()

Примеры

Простой пример

В следующем примере возвращается количество твитов с тем же типом темы, которые происходят в одно и то же время:

SELECT Topic, COUNT(*)
FROM TwitterStream TIMESTAMP BY CreatedAt
GROUP BY Topic, System.Timestamp()

Пример snapshot переворачивающегося окна

Распространенным использованием snapshot окон является агрегирование событий после их группировки по одной метке времени с помощью предыдущей оконной функции, например TumblingWindow ниже.

В следующем примере возвращается количество твитов с одинаковым типом темы для одного и того же пользователя в течение 30 минут:

WITH PerInterval AS (
    SELECT Topic, User, COUNT(*)
    FROM TwitterStream TIMESTAMP BY CreatedAt
    GROUP BY Topic, User, TumblingWindow(minute, 30)
)
SELECT * INTO UserTopicsCount FROM PerInterval

Чтобы найти количество пользователей и общее количество твитов на раздел за один и тот же интервал, можно использовать результат предыдущего запроса. Из-за переворачивающегося окна метки времени будут выровнены по 30-минутной границе, вы можете использовать окно snapshot для возврата событий на каждой границе, так как все они имеют одинаковое значение метки времени.

SELECT Topic, Users = COUNT(*), Total = SUM (count)
FROM PerInterval
GROUP BY Topic, System.Timestamp()

Предыдущий запрос возвращал количество пользователей и общее количество твитов для каждого раздела в течение того же 30-минутного интервала. Чтобы получить те же результаты один раз в 2 часа, добавьте в предложение GROUP BY 2 часа переворачивающееся окно.

Следующий запрос возвращает результаты всех четырех 30-минутных интервалов в конце каждого 2-часового окна.

SELECT Topic, Users = COUNT(*), Total = SUM (count)
FROM PerInterval
GROUP BY Topic, System.Timestamp(), Tumbling (hour, 2)

Пример агрегатных окон

System.Timestamp() можно использовать в качестве одного из окон в агрегатной конструкции Windows().

SELECT 
    TollId, 
    COUNT(*) 
FROM Input TIMESTAMP BY EntryTime 
GROUP BY 
    TollId, 
    Windows(
        TumblingWindow(minute, 10),
        TumblingWindow(minute, 20),
        System.Timestamp())