LAST (Azure Stream Analytics)

Аналитический оператор LAST позволяет искать самое последнее событие в потоке событий в пределах определенных ограничений. Это полезно в таких сценариях, как вычисление последнего известного хорошего значения (например, не null), поиск последнего времени, когда событие соответствует определенным критериям, и т. д.

В Stream Analytics область LAST (т. е. насколько далеко от текущего события оно должно искать) всегда ограничивается конечным интервалом времени с помощью предложения LIMIT DURATION. При необходимости можно ограничиться только событиями, которые соответствуют текущему событию для определенного свойства или условия с помощью предложений PARTITION BY и WHEN. НА LAST не влияют предикаты в предложении WHERE, условия соединения в предложении JOIN или выражения группировки в предложении GROUP BY текущего запроса.

Замечание: LAST(<expression>, <default>) эквивалентно LAG(<expression>, 0, <default>) (то есть значение смещения имеет значение "0"). Обратите внимание, что LAG(<expression>, 0, <default>) фактически не является допустимой конструкцией, так как LAG принимает смещение больше или равно 1. Поэтому вместо этого необходимо использовать оператор LAST, который был введен для удобства и лучшей удобочитаемости.

Синтаксис

LAST(<scalar_expression >, [<default>])    
       OVER ( [PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])  
  

Аргументы

scalar_expression

Возвращаемое значение. Это либо выражение любого типа, которое возвращает одно (скалярное) значение, либо выражение с подстановочным знаком "*". Для "*" будет возвращено все событие и будет содержаться в событии результата (вложенная запись). scalar_expression не должно содержать других аналитических функций или внешних функций.

default

Значение, возвращаемое при отсутствии критериев сопоставления событий. Если значение по умолчанию не задано, то возвращается NULL. "Нет события" может иметь место, если в течение интервала времени, указанного в limit_duration_clause, отсутствуют предыдущие события или событие существует, но не соответствует условию, указанному в when_clause. Если событие существует и значение scalar_expression равно NULL, возвращается значение NULL. Значение по умолчанию может быть столбцом, вложенным запросом или другим выражением, но не может содержать другие аналитические или внешние функции. Значение default должно иметь тот же тип, что и scalar_expression.

OVER ( [ предложение_partition_by ] предложение_limit_duration [предложение_when])

partition_by_clause Предложение partition BY <partition key> запрашивает только события, для которых задано значение
<ключ> секции совпадает с ключом текущего события.

limit_duration_clause DURATION(<единица>, <длина>):
Указывает, какая часть журнала из текущего события должна учитываться. В описании функции DATEDIFF приводятся подробные сведения о поддерживаемых единицах и их сокращения. Если в пределах интервала DURATION обнаружено недостаточное количество соответствующих событий, <возвращается значение по умолчанию> .

when_clause Задает логическое условие для событий, которые будут учитываться при вычислении LAST. Если в пределах интервала DURATION соответствующие события не найдены, <возвращается значение по умолчанию> . When_clause является необязательным.

Типы возвращаемых данных

Тип данных указанного выражения scalar_expression. Значение NULL возвращается, если scalar_expression

Общие замечания

Last является недетерминированным. События обрабатываются во временной последовательности. Если существует несколько событий с одинаковыми отметками времени, то они обрабатываются в порядке их получения.

Применение LAST к результирующем набору оконной функции может привести к непредвиденным результатам. Оконные функции изменяют метку времени событий, так как каждая операция окна выводит событие в конце окна. Доступ к текущей метке времени события можно получить с помощью system.timestamp() и после операции окна она будет отличаться от исходного атрибута времени события. Если не удается переместить last перед операцией окна, рассмотрите возможность использования CollectTop, упорядочив его по времени исходного события.

Примеры

Найти последние данные датчика, отличного от NULL:

SELECT  
       sensorId,   
       LAST(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)  
FROM input   

Найдите время, когда чтение было больше 50:

SELECT
       sensorId,
       LAST(System.Timestamp()) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading > 50 )
FROM input 

См. также:

ISFIRST (Azure Stream Analytics)
LAG (Azure Stream Analytics)