次の方法で共有


遅れ

✅ Azure Stream Analytics ✅ Fabric Eventstream

LAG 分析演算子を使用すると、特定の制約内でイベント ストリーム内の "前の" イベントを検索できます。 変数の増加率の計算、変数がしきい値を超えたとき、または条件の開始または停止が true であることを検出する場合に非常に便利です。

Stream Analytics では、LAG のスコープ (つまり、検索する必要がある現在のイベントから履歴に戻る距離) は、LIMIT DURATION 句を使用して、常に有限の時間間隔に制限されます。 必要に応じて、PARTITION BY 句と WHEN 句を使用して、特定のプロパティまたは条件の現在のイベントに一致するイベントのみを考慮するように LAG を制限できます。

LAG は、WHERE 句の述語、JOIN 句の結合条件、または現在のクエリの GROUP BY 句のグループ化式の影響を受けないのは、これらの句の前に評価されるためです。

構文

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

たとえば、次のようになります。

LAG(reading) OVER (LIMIT DURATION(hour, 3))  
LAG(name, 2, 'none such') OVER (PARTITION BY userId LIMIT DURATION(minute, 2))  

論争

scalar_expression

指定されたオフセットに基づいて返される値。 1 つの (スカラー) 値を返す任意の型の式か、ワイルドカード式 '*' のいずれかです。 '*' の場合、指定したオフセットに従ってイベント全体が返され、結果イベント (入れ子になったレコード) に格納されます。
scalar_expressionには、他の分析関数や外部関数を含めることはできません。

オフセット

値を取得する現在のイベントから返されるイベントの数。 指定しない場合、既定値は 1 です。つまり、前のイベントが返されます。 オフセットは、1 以上の整数である必要があります。 イベントは一時的な順序で処理されます。 同じタイム スタンプ イベントを持つ複数のイベントがある場合は、到着順に処理されます。

デフォルト

指定したオフセットにイベントがない場合に返す値。 既定値を指定しない場合、NULL が返されます。 'No event at the specified offset' can be case 1) if the corresponding events seen than the specified offset or 2) if the event at the specified offset is timed out according the specified limit_duration_clause 3) events exist but not match boolean condition specified in the when_clause.

指定したオフセットのイベントが存在し、scalar_expressionの値が NULL の場合、NULL
が返されます。 既定値には列、サブクエリ、またはその他の式を指定できますが、他の式を含めることはできません。
分析関数または外部関数。 default は、次とまったく同じ型である必要があります
scalar_expression。

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause PARTITION BY パーティション キー 句は、値が < のイベントのみを要求します。
<パーティション キー> は、現在のイベントが考慮されるのと同じです。 たとえば、

LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  

は、現在のイベントと同じセンサーの以前の読み取り値を返します (前の 1 時間以内に発生した場合)。

limit_duration句 DURATION(<unit>, <length>)

現在のイベントの履歴を考慮する必要がある量を指定します。 サポートされているユニットとその省略形の詳細については、DATEDIFF を参照してください。 DURATION 間隔内に十分な一致イベントが見つからない場合は、 <default> 値が返されます。

when_clause
LAG 計算で考慮されるイベントのブール条件を指定します。 DURATION 間隔内に十分な一致イベントが見つからない場合は、 <default> 値が返されます。 when_clauseは省略可能です。

戻り値の型

指定したscalar_expressionのデータ型。 scalar_expression場合は NULL が返されます

全般的な解説

LAG は非決定的です。 イベントは一時的な順序で処理されます。 同じタイム スタンプ イベントを持つ複数のイベントがある場合は、到着順に処理されます。

ウィンドウ関数の結果セットに LAG を適用すると、予期しない結果が発生する可能性があります。 ウィンドウ関数は、すべてのウィンドウ操作がウィンドウの最後にイベントを出力する際に、イベントのタイムスタンプを変更します。 イベントの現在のタイムスタンプには system.timestamp()を使用してアクセスできます。ウィンドウ操作の後、元のイベント時刻属性とは異なります。 ウィンドウ操作の前に LAG を移動できない場合は、 CollectTop を使用して、元のイベント時間で並べ替える方法を検討してください。

例示

センサーごとの増加率を計算します。

SELECT sensorId,  
       growth = reading -
                        LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  
FROM input  
  

以前の not-null センサーの読み取り値を検索します。

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

特定のセンサーの種類について、以前の null 以外のセンサー読み取り値を検索します。

WITH filterSensor AS
(
  SELECT *
  FROM input
  WHERE input.sensorType = 4 AND sensorId IS NOT NULL
)

SELECT
  LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
FROM filterSensor

変数がしきい値を超えたタイミングを決定します。

SELECT
    sensorId, reading
FROM input
WHERE
    devicetype = 'thermostat'
    AND reading > 100
    AND LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN devicetype = 'thermostat') <= 100

こちらもご覧ください

ISFIRST
最後の を する