LAG

✅ Azure Stream Analytics ✅ Fabric Eventstream

Operator analitik LAG memungkinkan seseorang untuk mencari peristiwa "sebelumnya" dalam aliran peristiwa, dalam batasan tertentu. Ini sangat berguna untuk menghitung laju pertumbuhan variabel, mendeteksi ketika variabel melewati ambang batas, atau ketika kondisi dimulai atau berhenti menjadi benar.

Di Azure Stream Analytics, cakupan LAG (yaitu seberapa jauh ke belakang riwayat dari peristiwa saat ini yang perlu dilihat) selalu terbatas pada interval waktu terbatas, menggunakan klausul LIMIT DURATION. LAG secara opsional dapat dibatasi untuk hanya mempertimbangkan peristiwa yang cocok dengan peristiwa saat ini pada properti atau kondisi tertentu menggunakan klausa PARTITION BY dan WHEN.

LAG tidak dipengaruhi oleh predikat dalam klausa WHERE, kondisi gabungan dalam klausa JOIN, atau ekspresi pengelompokan dalam klausul GROUP BY dari kueri saat ini karena dievaluasi sebelum klausul tersebut.

Sintaksis

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

Misalnya:

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

Argumen

scalar_expression

Nilai yang akan dikembalikan berdasarkan offset yang ditentukan. Ini adalah ekspresi dari jenis apa pun yang mengembalikan nilai tunggal (skalar) atau ekspresi kartubebas '*'. Untuk '*' seluruh peristiwa sesuai dengan offset yang ditentukan akan dikembalikan dan akan dimuat dalam peristiwa hasil (catatan berlapis).
scalar_expression tidak boleh berisi fungsi analitik atau fungsi eksternal lainnya.

Offset

Jumlah peristiwa kembali dari peristiwa saat ini untuk mendapatkan nilai. Jika tidak ditentukan, defaultnya adalah 1, yang berarti mengembalikan peristiwa sebelumnya. Offset harus berupa bilangan bulat yang lebih besar dari atau sama dengan 1. Peristiwa diproses dalam urutan temporal. Jika ada beberapa peristiwa dengan peristiwa stempel waktu yang sama diproses dalam urutan kedatangan.

Default

Nilai yang akan dikembalikan ketika tidak ada peristiwa pada offset yang ditentukan. Jika nilai default tidak ditentukan, NULL dikembalikan. 'Tidak ada peristiwa pada offset yang ditentukan' yang dapat menjadi kasus 1) jika jumlah peristiwa terkait yang terlihat sejauh ini lebih kecil dari offset yang ditentukan atau 2) jika peristiwa pada offset yang ditentukan kehabisan waktu sesuai dengan peristiwa limit_duration_clause 3) yang ditentukan tetapi tidak cocok dengan kondisi boolean yang ditentukan dalam when_clause.

Jika peristiwa di offset yang ditentukan ada dan nilai scalar_expression adalah NULL maka NULL
dikembalikan. default bisa berupa kolom, subkueri, atau ekspresi lainnya, tetapi tidak boleh berisi yang lain
fungsi analitik atau fungsi eksternal. default harus memiliki jenis yang sama persis dengan
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause Klausul kunci> partisi BY <partisi meminta bahwa hanya peristiwa yang nilainya
<kunci> partisi sama dengan peristiwa saat ini yang dipertimbangkan. Contohnya,

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

akan mengembalikan pembacaan sebelumnya dari sensor yang sama dengan peristiwa saat ini (jika itu terjadi dalam 1 jam sebelumnya).

klausa limit_duration DURATION(<unit>, <panjang>)

Menentukan berapa banyak riwayat dari peristiwa saat ini yang harus dipertimbangkan. Lihat DATEDIFF untuk deskripsi terperinci tentang unit yang didukung dan singkatannya. Jika tidak cukup peristiwa yang cocok ditemukan dalam interval DURATION, <nilai default> dikembalikan.

when_clause
Menentukan kondisi boolean agar peristiwa dipertimbangkan dalam komputasi LAG. Jika tidak cukup peristiwa yang cocok ditemukan dalam interval DURATION, <nilai default> dikembalikan. when_clause bersifat opsional.

Jenis Kembalian

Jenis data dari scalar_expression yang ditentukan. NULL dikembalikan jika scalar_expression

Keterangan Umum

LAG bersifat nondeterministik. Peristiwa diproses dalam urutan temporal. Jika ada beberapa peristiwa dengan peristiwa stempel waktu yang sama diproses dalam urutan kedatangan.

Menerapkan LAG pada kumpulan hasil fungsi windowing dapat menghasilkan hasil yang tidak terduga. Fungsi windowing mengubah tanda waktu peristiwa, karena setiap operasi jendela menghasilkan peristiwa di akhir jendela. Tanda waktu peristiwa saat ini dapat diakses dengan system.timestamp(), setelah operasi jendela, itu akan berbeda dari atribut waktu peristiwa asli. Jika LAG tidak dapat dipindahkan sebelum operasi jendela, pertimbangkan untuk menggunakan CollectTop, mengurutkan berdasarkan waktu peristiwa asli.

Contoh

Menghitung tingkat pertumbuhan, per sensor:

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

Temukan pembacaan sensor not-null sebelumnya:

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

Temukan pembacaan sensor non-null sebelumnya untuk jenis sensor tertentu:

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

Tentukan kapan variabel melewati ambang batas:

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

Lihat Juga

ISFIRST
TERAKHIR