Pola kueri umum di Azure Stream Analytics

Kueri di Azure Stream Analytics diekspresikan dalam bahasa kueri seperti SQL. Susunan bahasa didokumentasikan dalam panduan referensi bahasa kueri Azure Stream Analytics.

Desain kueri dapat mengekspresikan logika pass-through sederhana untuk memindahkan data peristiwa dari satu stream input ke penyimpanan data keluaran, atau dapat melakukan pencocokan pola yang kaya dan analisis temporal untuk menghitung agregat melalui berbagai jendela waktu seperti dalam Membangun IoT solusi dengan menggunakan panduan Azure Stream Analytics. Anda dapat menggabungkan data dari beberapa input untuk menggabungkan acara streaming, dan Anda dapat melakukan pencarian terhadap data referensi statis untuk memperkaya nilai acara. Anda juga dapat menulis data ke beberapa output.

Artikel ini menguraikan solusi untuk beberapa pola kueri umum berdasarkan skenario dunia nyata.

Format Data yang Didukung

Dukungan Azure Stream Analytics memproses peristiwa dalam format data CSV, JSON, dan Avro. Format JSON dan Avro dapat berisi jenis kompleks seperti objek berlapis (rekaman) atau array. Untuk informasi selengkapnya tentang bekerja dengan jenis data kompleks ini, lihat Mengurai data JSON dan AVRO.

Kirim data ke beberapa output

Beberapa pernyataan PILIH dapat digunakan untuk mengeluarkan data ke sink keluaran yang berbeda. Misalnya, satu pernyataan SELECT dapat menghasilkan pemberitahuan berbasis ambang sementara yang lain dapat menghasilkan peristiwa ke penyimpanan blob.

Pertimbangkan input berikut:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

Dan, Anda menginginkan dua output berikut dari kueri:

ArchiveOutput:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

AlertOutput:

| Make | Time | Count |
| --- | --- | --- |
| Make2 |2023-01-01T00:00:10.0000000Z |3 |

Kueri dengan dua pernyataan SELECT dengan output Arsip dan Output pemberitahuan sebagai output:

SELECT
	*
INTO
	ArchiveOutput
FROM
	Input TIMESTAMP BY Time

SELECT
	Make,
	System.TimeStamp() AS Time,
	COUNT(*) AS [Count]
INTO
	AlertOutput
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)
HAVING
	[Count] >= 3

Klausa INTO memberi tahu layanan Azure Stream Analytics output mana yang akan ditulis datanya. PILIH pertama mendefinisikan kueri penerusan yang menerima data dari masukan dan mengirimkannya ke keluaran bernama ArchiveOutput. Kueri kedua menggabungkan dan memfilter data sebelum mengirim hasil ke output sistem peringatan hilir yang disebut AlertOutput.

Klausa WITH dapat digunakan untuk menentukan beberapa blok subkueri. Opsi ini memiliki manfaat membuka lebih sedikit pembaca ke sumber input.

Kueri:

WITH ReaderQuery AS (
	SELECT
		*
	FROM
		Input TIMESTAMP BY Time
)

SELECT * INTO ArchiveOutput FROM ReaderQuery

SELECT 
	Make,
	System.TimeStamp() AS Time,
	COUNT(*) AS [Count] 
INTO AlertOutput 
FROM ReaderQuery
GROUP BY
	Make,
	TumblingWindow(second, 10)
HAVING [Count] >= 3

Untuk informasi selengkapnya, lihat DENGAN klausa.

Permintaan pass-through sederhana

Permintaan pass-through sederhana dapat digunakan untuk menyalin data stream input ke dalam output. Misalnya, jika aliran data yang berisi informasi kendaraan real-time perlu disimpan dalam database SQL untuk analisis nanti, kueri pass-through sederhana melakukan pekerjaan tersebut.

Pertimbangkan input berikut:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Anda ingin output sama dengan input:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Berikut kuerinya:

SELECT
	*
INTO Output
FROM Input

Kueri SELECT * ini memproyeksikan semua bidang peristiwa masuk dan mengirimkannya ke output. Sebagai gantinya, Anda hanya dapat memproyeksikan bidang yang diperlukan dalam pernyataan SELECT . Dalam contoh berikut, pernyataan SELECT hanya memproyeksikan bidang Buat dan Waktu dari data input.

Pertimbangkan input berikut:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |

Anda ingin output hanya memiliki bidang Buat dan Waktu:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:04.0000000Z |

Berikut adalah kueri yang hanya memproyeksikan bidang yang diperlukan:

SELECT
	Make, Time
INTO Output
FROM Input

Pencocokan string dengan LIKE dan NOT LIKE

LIKE dan NOT LIKE dapat digunakan untuk memverifikasi apakah suatu bidang cocok dengan pola tertentu. Misalnya, Anda dapat menggunakan filter untuk mengembalikan hanya pelat lisensi yang dimulai dengan huruf A dan diakhir dengan angka 9.

Pertimbangkan input berikut:

| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

Anda ingin output memiliki pelat nomor yang dimulai dengan huruf A dan diakhir dengan angka 9:

| Make | License_plate | Time |
| --- | --- | --- |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

Berikut adalah kueri yang menggunakan operator LIKE:

SELECT
	*
FROM
	Input TIMESTAMP BY Time
WHERE
	License_plate LIKE 'A%9'

Gunakan pernyataan LIKE untuk memeriksa nilai bidang License_plate. Ini harus dimulai dengan huruf A, lalu memiliki untai (karakter) nol atau lebih, berakhir dengan angka 9.

Perhitungan atas peristiwa masa lalu

Fungsi LAG dapat digunakan untuk melihat peristiwa masa lalu dalam jendela waktu dan membandingkannya dengan peristiwa saat ini. Misalnya, membuat mobil saat ini dapat dihasilkan jika berbeda dari pembuatan mobil terakhir yang melewati pintu tol.

Contoh input:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |

Contoh output:

| Make | Time |
| --- | --- |
| Make2 |2023-01-01T00:00:02.0000000Z |

Kueri sampel:

SELECT
	Make,
	Time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make

Gunakan LAG untuk mengintip ke dalam stream masukan satu peristiwa kembali, mengambil nilai Buat dan membandingkannya dengan nilai Buat peristiwa saat ini dan keluaran peristiwa tersebut.

Untuk informasi selengkapnya, lihat LAG.

Kembalikan acara terakhir di jendela

Karena peristiwa dikonsumsi oleh sistem secara real time, tidak ada fungsi yang dapat menentukan apakah peristiwa adalah peristiwa terakhir yang tiba untuk jendela waktu tersebut. Untuk mencapai hal ini, aliran input perlu digabungkan dengan yang lain di mana waktu peristiwa adalah waktu maksimum untuk semua peristiwa di jendela tersebut.

Contoh input:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Contoh output dengan informasi tentang mobil terakhir dalam dua jendela waktu sepuluh menit:

| License_plate | Make | Time |
| --- | --- | --- |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Kueri sampel:

WITH LastInWindow AS
(
	SELECT 
		MAX(Time) AS LastEventTime
	FROM 
		Input TIMESTAMP BY Time
	GROUP BY 
		TumblingWindow(minute, 10)
)

SELECT 
	Input.License_plate,
	Input.Make,
	Input.Time
FROM
	Input TIMESTAMP BY Time 
	INNER JOIN LastInWindow
	ON DATEDIFF(minute, Input, LastInWindow) BETWEEN 0 AND 10
	AND Input.Time = LastInWindow.LastEventTime

Langkah pertama pada kueri menemukan stempel waktu maksimum di jendela 10 menit, yaitu, stempel waktu peristiwa terakhir untuk jendela tersebut. Langkah kedua menggabungkan hasil kueri pertama dengan aliran asli untuk menemukan peristiwa yang cocok dengan stempel waktu terakhir di setiap jendela.

DATEDIFF adalah fungsi khusus tanggal yang membandingkan dan mengembalikan perbedaan waktu antara dua bidang TanggalWaktu, untuk informasi selengkapnya, lihatfungsi tanggal.

Untuk informasi selengkapnya tentang bergabung dengan stream, lihat GABUNG.

Agregasi data dari waktu ke waktu

Untuk menghitung informasi selama jendela waktu, Anda dapat mengagregasi data. Dalam contoh ini, pernyataan menghitung hitungan selama 10 detik terakhir untuk setiap pembuatan mobil tertentu.

Contoh input:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |

Contoh output:

| Make | Count |
| --- | --- |
| Make1 | 2 |
| Make2 | 1 |

Kueri:

SELECT
	Make,
	COUNT(*) AS Count
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

Agregasi ini mengelompokkan mobil menurut Membuat dan menghitungnya setiap 10 detik. Output memiliki Make and Count mobil yang melewati pintu tol.

TumblingWindow adalah fungsi windowing yang digunakan untuk mengelompokkan acara bersama-sama. Agregasi dapat diterapkan pada semua peristiwa yang dikelompokkan. Untuk informasi selengkapnya, lihat fungsi jendela.

Untuk informasi selengkapnya tentang agregasi, lihat fungsi agregat.

Nilai keluaran secara berkala

Ketika peristiwa hilang atau tidak teratur, output interval reguler dapat dihasilkan dari input data yang lebih jarang. Misalnya, buat peristiwa setiap 5 detik yang melaporkan titik data yang paling baru dilihat.

Contoh input:

| Time | Value |
| --- | --- |
| "2014-01-01T06:01:00" |1 |
| "2014-01-01T06:01:05" |2 |
| "2014-01-01T06:01:10" |3 |
| "2014-01-01T06:01:15" |4 |
| "2014-01-01T06:01:30" |5 |
| "2014-01-01T06:01:35" |6 |

Sampel output (10 baris pertama):

| Window_end | Last_event.Time | Last_event.Value |
| --- | --- | --- |
| 2014-01-01T14:01:00.000Z |2014-01-01T14:01:00.000Z |1 |
| 2014-01-01T14:01:05.000Z |2014-01-01T14:01:05.000Z |2 |
| 2014-01-01T14:01:10.000Z |2014-01-01T14:01:10.000Z |3 |
| 2014-01-01T14:01:15.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:20.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:25.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:30.000Z |2014-01-01T14:01:30.000Z |5 |
| 2014-01-01T14:01:35.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:40.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:45.000Z |2014-01-01T14:01:35.000Z |6 |

Kueri sampel:

SELECT
	System.Timestamp() AS Window_end,
	TopOne() OVER (ORDER BY Time DESC) AS Last_event
FROM
	Input TIMESTAMP BY Time
GROUP BY
	HOPPINGWINDOW(second, 300, 5)

Kueri ini menghasilkan peristiwa setiap 5 detik dan menampilkan peristiwa terakhir yang diterima sebelumnya. Durasi HOPPINGWINDOW menentukan seberapa jauh ke belakang tampilan kueri untuk menemukan acara terbaru.

Untuk informasi selengkapnya, lihat Jendela melompat.

Menghubungkan peristiwa dalam stream a

Menghubungkan peristiwa dalam stream yang sama dapat dilakukan dengan melihat peristiwa sebelumnya menggunakan fungsi LAG. Misalnya, output dapat dihasilkan setiap kali dua mobil berturut-turut dari yang sama Buat melalui pintu tol dalam 90 detik terakhir.

Contoh input:

| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make1 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make2 |DEF-987 |2023-01-01T00:00:03.0000000Z |
| Make1 |GHI-345 |2023-01-01T00:00:04.0000000Z |

Contoh output:

| Make | Time | Current_car_license_plate | First_car_license_plate | First_car_time |
| --- | --- | --- | --- | --- |
| Make1 |2023-01-01T00:00:02.0000000Z |AAA-999 |ABC-123 |2023-01-01T00:00:01.0000000Z |

Kueri sampel:

SELECT
	Make,
	Time,
	License_plate AS Current_car_license_plate,
	LAG(License_plate, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_license_plate,
	LAG(Time, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(second, 90)) = Make

Fungsi LAG dapat melihat ke dalam stream masukan satu peristiwa kembali dan mengambil nilai Buat, membandingkannya dengan nilai Buat peristiwa saat ini. Setelah kondisi terpenuhi, data dari peristiwa sebelumnya dapat diproyeksikan menggunakan LAG dalam pernyataan PILIH.

Untuk informasi selengkapnya, lihat LAG.

Deteksi durasi antar acara

Durasi acara dapat dihitung dengan melihat acara Mulai terakhir setelah acara Akhir diterima. Kueri ini dapat berguna untuk menentukan waktu yang dihabiskan pengguna di halaman atau fitur.

Contoh input:

| User | Feature | Event | Time |
| --- | --- | --- | --- |
| user@location.com |RightMenu |Start |2023-01-01T00:00:01.0000000Z |
| user@location.com |RightMenu |End |2023-01-01T00:00:08.0000000Z |

Contoh output:

| User | Feature | Duration |
| --- | --- | --- |
| user@location.com |RightMenu |7 |

Kueri sampel:

SELECT
	[user],
	feature,
	DATEDIFF(
		second,
		LAST(Time) OVER (PARTITION BY [user], feature LIMIT DURATION(hour, 1) WHEN Event = 'start'),
		Time) as duration
FROM input TIMESTAMP BY Time
WHERE
	Event = 'end'

Fungsi LAST dapat digunakan untuk mengambil peristiwa terakhir dalam kondisi tertentu. Dalam contoh ini, kondisinya adalah peristiwa dengan tipe Mulai, mempartisi penelusuran menurut pengguna dan fitur PARTITION BY. Dengan cara ini, setiap pengguna, dan fitur diperlakukan secara independen saat mencari peristiwa Mulai. LIMIT DURATION membatasi waktu penelusuran hingga 1 jam antara peristiwa Akhir dan Awal.

Hitung nilai unik

COUNT dan DISTINCT dapat digunakan untuk menghitung jumlah nilai bidang unik yang muncul di stream dalam jangka waktu tertentu. Anda dapat membuat kueri untuk menghitung berapa banyak Pembuatan mobil unik yang telah melewati pintu tol di jendela 2 detik.

Contoh input:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

Contoh output:

| Count_make | Time |
| --- | --- |
| 2 |2023-01-01T00:00:02.000Z |
| 1 |2023-01-01T00:00:04.000Z |

Kueri sampel :

SELECT
     COUNT(DISTINCT Make) AS Count_make,
     System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY 
     TumblingWindow(second, 2)

COUNT(DISTINCT Make) mengembalikan jumlah nilai yang berbeda di kolom Buat dalam jangka waktu. Untuk informasi selengkapnya, lihat COUNT fungsi agregat.

Ambil acara pertama di jendela

Anda dapat menggunakan IsFirst untuk mengambil peristiwa pertama dalam jendela waktu. Misalnya, mengeluarkan informasi mobil pertama setiap interval 10 menit.

Contoh input:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Contoh output:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |

Kueri sampel:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) = 1

IsFirst juga dapat mempartisi data dan menghitung peristiwa pertama untuk setiap mobil tertentu yang Buat ditemukan pada setiap interval 10 menit.

Contoh output:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Kueri sampel:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) OVER (PARTITION BY Make) = 1

Untuk informasi selengkapnya, lihat IsFirst.

Hapus acara duplikat di jendela

Saat Anda melakukan operasi seperti menghitung rata-rata atas peristiwa di jendela waktu tertentu, peristiwa duplikat harus difilter. Dalam contoh berikut, acara kedua adalah duplikat dari yang pertama.

Contoh input:

| DeviceId | Time | Attribute | Value |
| --- | --- | --- | --- |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 2 |2018-07-27T00:00:01.0000000Z |Temperature |40 |
| 1 |2018-07-27T00:00:05.0000000Z |Temperature |60 |
| 2 |2018-07-27T00:00:05.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:10.0000000Z |Temperature |100 |

Contoh output:

| AverageValue | DeviceId |
| --- | --- |
| 70 | 1 |
|45 | 2 |

Kueri sampel:

WITH Temp AS (
	SELECT Value, DeviceId
	FROM Input TIMESTAMP BY Time
	GROUP BY Value, DeviceId, System.Timestamp()
)
 

SELECT
	AVG(Value) AS AverageValue, DeviceId
INTO Output
FROM Temp
GROUP BY DeviceId,TumblingWindow(minute, 5)

Ketika pernyataan pertama dijalankan, rekaman duplikat digabungkan menjadi satu karena bidang dalam klausa grup menurut semuanya sama. Oleh karena itu, ia menghapus duplikat.

Tentukan logika untuk kasus/nilai yang berbeda (pernyataan CASE)

Pernyataan CASE dapat memberikan penghitungan yang berbeda untuk bidang yang berbeda, berdasarkan kriteria tertentu. Misalnya, tetapkan jalur A ke mobil dan jalur B ke buatan Make1 lain.

Contoh input:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

Contoh output:

| Make |Dispatch_to_lane | Time |
| --- | --- | --- |
| Make1 |"A" |2023-01-01T00:00:01.0000000Z |
| Make2 |"B" |2023-01-01T00:00:02.0000000Z |

Kueri sampel:

SELECT
	Make
	CASE
		WHEN Make = "Make1" THEN "A"
		ELSE "B"
	END AS Dispatch_to_lane,
	System.TimeStamp() AS Time
FROM
	Input TIMESTAMP BY Time

Ekspresi CASE membandingkan ekspresi dengan sekumpulan ekspresi sederhana untuk menentukan hasilnya. Dalam contoh ini, kendaraan Make1 dikirim ke jalur A sementara kendaraan buatan lain akan ditetapkan jalur B.

Untuk informasi selengkapnya, lihat kasus ekspresi.

Konversi data

Data dapat tansmisikan waktu nyata menggunakan metode CAST. Misalnya, bobot mobil dapat dikonversi dari jenis nvarchar(maks) ke jenis bigint dan digunakan dalam perhitungan numerik.

Contoh input:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Contoh output:

| Make | Weight |
| --- | --- |
| Make1 |3000 |

Kueri sampel:

SELECT
	Make,
	SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

Gunakan pernyataan CAST untuk menentukan tipe datanya. Lihat daftar jenis data yang didukung di Jenis data (Azure Stream Analytics).

Untuk informasi selengkapnya tentang fungsi konversi data.

Mendeteksi durasi suatu kondisi

Untuk kondisi yang mencakup beberapa peristiwa, fungsi LAG dapat digunakan untuk mengidentifikasi durasi kondisi tersebut. Misalnya, misalkan bug mengakibatkan semua mobil memiliki bobot yang salah (di atas 20.000 pon), dan durasi bug itu harus dihitung.

Contoh input:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |2000 |
| Make2 |2023-01-01T00:00:02.0000000Z |25000 |
| Make1 |2023-01-01T00:00:03.0000000Z |26000 |
| Make2 |2023-01-01T00:00:04.0000000Z |25000 |
| Make1 |2023-01-01T00:00:05.0000000Z |26000 |
| Make2 |2023-01-01T00:00:06.0000000Z |25000 |
| Make1 |2023-01-01T00:00:07.0000000Z |26000 |
| Make2 |2023-01-01T00:00:08.0000000Z |2000 |

Contoh output:

| Start_fault | End_fault |
| --- | --- |
| 2023-01-01T00:00:02.000Z |2023-01-01T00:00:07.000Z |

Kueri sampel:

WITH SelectPreviousEvent AS
(
SELECT
	*,
	LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous_time,
	LAG([weight]) OVER (LIMIT DURATION(hour, 24)) as previous_weight
FROM input TIMESTAMP BY [time]
)

SELECT 
	LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_weight < 20000 ) [Start_fault],
	previous_time [End_fault]
FROM SelectPreviousEvent
WHERE
	[weight] < 20000
	AND previous_weight > 20000

Pernyataan PILIH pertama menghubungkan pengukuran berat saat ini dengan pengukuran sebelumnya, memproyeksikannya bersama dengan pengukuran saat ini. PILIH kedua melihat kembali ke peristiwa terakhir dengan bobot_sebelumnya kurang dari 20000, dengan bobot saat ini lebih kecil dari 20000 dan berat_sebelumnya dari peristiwa saat ini lebih besar dari 20000.

End_fault adalah peristiwa nonfaulty saat ini di mana peristiwa sebelumnya rusak, dan Start_fault adalah peristiwa nonfaulty terakhir sebelum itu.

Proses peristiwa dengan waktu independen (Substream)

Acara dapat datang terlambat atau rusak karena perbedaan jam antara produser acara, kemiringan jam antara partisi, atau latensi jaringan. Misalnya, jam perangkat untuk TollID 2 adalah lima detik di belakang TollID 1, dan jam perangkat untuk TollID 3 adalah 10 detik di belakang TollID 1. Perhitungan dapat terjadi secara independen untuk setiap tol, dengan hanya mempertimbangkan data jamnya sendiri sebagai stempel waktu.

Contoh input:

| LicensePlate | Make | Time | TollID |
| --- | --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:01.0000000Z | 1 |
| YHN 6970 |Make2 |2023-07-27T00:00:05.0000000Z | 1 |
| QYF 9358 |Make1 |2023-07-27T00:00:01.0000000Z | 2 |
| GXF 9462 |Make3 |2023-07-27T00:00:04.0000000Z | 2 |
| VFE 1616 |Make2 |2023-07-27T00:00:10.0000000Z | 1 |
| RMV 8282 |Make1 |2023-07-27T00:00:03.0000000Z | 3 |
| MDR 6128 |Make3 |2023-07-27T00:00:11.0000000Z | 2 |
| YZK 5704 |Make4 |2023-07-27T00:00:07.0000000Z | 3 |

Contoh output:

| TollID | Count |
| --- | --- |
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |

Kueri sampel:

SELECT
      TollId,
      COUNT(*) AS Count
FROM input
      TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId

Klausa TIMESTAMP OVER BY melihat setiap linimasa perangkat secara independen menggunakan sub-stream. Peristiwa output untuk setiap TollID dihasilkan saat dikomputasi, artinya peristiwa tersebut berurutan sehubungan dengan setiap TollID alih-alih diurutkan ulang seolah-olah semua perangkat berada pada jam yang sama.

Untuk informasi selengkapnya, lihat STEMPEL WAKTU LEBIH DARI.

Jendela Sesi

Jendela sesi adalah jendela yang terus diperluas saat peristiwa terjadi dan ditutup untuk komputasi jika tidak ada peristiwa yang diterima setelah jumlah waktu tertentu atau jika jendela mencapai durasi maksimumnya. Jendela ini sangat berguna saat menghitung data interaksi pengguna. Jendela dimulai ketika pengguna mulai berinteraksi dengan sistem dan menutup ketika tidak ada lagi peristiwa yang diamati, artinya pengguna telah berhenti berinteraksi. Misalnya, pengguna berinteraksi dengan halaman web di mana jumlah klik dicatat, Jendela Sesi dapat digunakan untuk mengetahui berapa lama pengguna berinteraksi dengan situs.

Contoh input:

| User_id | Time | URL |
| --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | "www.example.com/a.html" |
| 0 | 2017-01-26T00:00:20.0000000Z | "www.example.com/b.html" |
| 1 | 2017-01-26T00:00:55.0000000Z | "www.example.com/c.html" |
| 0 | 2017-01-26T00:01:10.0000000Z | "www.example.com/d.html" |
| 1 | 2017-01-26T00:01:15.0000000Z | "www.example.com/e.html" |

Contoh output:

| User_id | StartTime | EndTime | Duration_in_seconds |
| --- | --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | 2017-01-26T00:01:10.0000000Z | 70 |
| 1 | 2017-01-26T00:00:55.0000000Z | 2017-01-26T00:01:15.0000000Z | 20 |

Kueri sampel:

SELECT
	user_id,
	MIN(time) as StartTime,
	MAX(time) as EndTime,
	DATEDIFF(second, MIN(time), MAX(time)) AS duration_in_seconds
FROM input TIMESTAMP BY time
GROUP BY
	user_id,
	SessionWindow(minute, 1, 60) OVER (PARTITION BY user_id)

PILIH memproyeksikan data yang relevan dengan interaksi pengguna, bersama dengan durasi interaksi. Mengelompokkan data menurut pengguna dan SessionWindow yang ditutup jika tidak ada interaksi yang terjadi dalam 1 menit, dengan ukuran jendela maksimum 60 menit.

Untuk informasi selengkapnya tentang SessionWindow, lihatSessionWindow.

Fungsi yang ditentukan pengguna di JavaScript dan C#

Bahasa kueri Azure Stream Analytics dapat diperluas dengan fungsi kustom yang ditulis dalam bahasa JavaScript atau C#. Fungsi yang Ditentukan Pengguna (UDF) adalah komputasi kustom/kompleks yang tidak dapat dengan mudah diekspresikan menggunakan bahasa SQL. UDF ini dapat ditentukan sekali dan digunakan beberapa kali dalam kueri. Misalnya, UDF dapat digunakan untuk mengonversi nilai nvarchar(max) heksadesimal menjadi nilai bigint.

Contoh input:

| Device_id | HexValue |
| --- | --- |
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |

Contoh output:

| Device_id | Decimal |
| --- | --- |
| 1 | 180 |
| 2 | 283 |
| 3 | 289 |
function hex2Int(hexValue){
	return parseInt(hexValue, 16);
}
public static class MyUdfClass {
	public static long Hex2Int(string hexValue){
		return int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
	}
}
SELECT
	Device_id,
	udf.Hex2Int(HexValue) AS Decimal
From
	Input

Fungsi yang Ditentukan Pengguna menghitung nilai bigint dari HexValue pada setiap peristiwa yang dikonsumsi.

Untuk informasi selengkapnya, lihat JavaScript dan C#.

Pencocokan pola tingkat lanjut dengan MATCH_RECOGNIZE

MATCH_RECOGNIZE adalah mekanisme pencocokan pola lanjutan yang dapat digunakan untuk mencocokkan urutan peristiwa dengan pola ekspresi reguler yang terdefinisi dengan baik. Misalnya, ATM sedang dipantau secara real time untuk kegagalan, selama pengoperasian ATM jika ada dua pesan peringatan berturut-turut, administrator perlu diberi tahu.

Input:

| ATM_id | Operation_id | Return_Code | Time |
| --- | --- | --- | --- |
| 1 | "Entering Pin" | "Success" | 2017-01-26T00:10:00.0000000Z |
| 2 | "Opening Money Slot" | "Success" | 2017-01-26T00:10:07.0000000Z |
| 2 | "Closing Money Slot" | "Success" | 2017-01-26T00:10:11.0000000Z |
| 1 | "Entering Withdraw Quantity" | "Success" | 2017-01-26T00:10:08.0000000Z |
| 1 | "Opening Money Slot" | "Warning" | 2017-01-26T00:10:14.0000000Z |
| 1 | "Printing Bank Balance" | "Warning" | 2017-01-26T00:10:19.0000000Z |

Output:

| ATM_id | First_Warning_Operation_id | Warning_Time |
| --- | --- | --- |
| 1 | "Opening Money Slot" | 2017-01-26T00:10:14.0000000Z |
SELECT *
FROM input TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
	LIMIT DURATION(minute, 1)
	PARTITION BY ATM_id
	MEASURES
		First(Warning.ATM_id) AS ATM_id,
		First(Warning.Operation_Id) AS First_Warning_Operation_id,
		First(Warning.Time) AS Warning_Time
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN (Success+ Warning{2,})
	DEFINE
		Success AS Succes.Return_Code = 'Success',
		Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch

Kueri ini cocok dengan setidaknya dua peristiwa kegagalan berturut-turut dan menghasilkan alarm ketika kondisi terpenuhi. PATTERN mendefinisikan ekspresi reguler yang akan digunakan pada pencocokan, dalam hal ini, setidaknya dua peringatan berturut-turut setelah setidaknya satu operasi berhasil. Keberhasilan dan Kegagalan ditentukan menggunakan nilai Return_Code dan setelah kondisi terpenuhi, MEASURES diproyeksikan dengan ATM_id, operasi peringatan pertama dan waktu peringatan pertama.

Untuk informasi selengkapnya, lihat MATCH_RECOGNIZE.

Geofencing dan kueri geospasial

Azure Stream Analytics menyediakan fungsi geospasial bawaan yang dapat digunakan untuk menerapkan skenario seperti manajemen armada, berbagi perjalanan, mobil yang terhubung, dan pelacakan aset. Data geospasial dapat diserap dalam format GeoJSON atau WKT sebagai bagian dari stream peristiwa atau data referensi. Misalnya, sebuah perusahaan yang mengkhususkan diri dalam pembuatan mesin untuk mencetak paspor, menyewakan mesin mereka kepada pemerintah dan konsulat. Lokasi mesin-mesin tersebut sangat dikontrol untuk menghindari kesalahan penempatan dan kemungkinan penggunaan untuk pemalsuan paspor. Setiap mesin dilengkapi dengan pelacak GPS, informasi tersebut disampaikan kembali ke pekerjaan Azure Stream Analytics. Pabrikan ingin melacak lokasi mesin-mesin itu dan diberi tahu jika salah satu dari mereka meninggalkan area resmi, dengan cara ini mereka dapat menonaktifkan, memperingatkan pihak berwenang, dan mengambil peralatan dari jarak jauh.

Input:

| Equipment_id | Equipment_current_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13288797982818 47.64082002051315)" | 2017-01-26T00:10:00.0000000Z |
| 1 | "POINT(-122.13307252987875 47.64081350934929)" | 2017-01-26T00:11:00.0000000Z |
| 1 | "POINT(-122.13308862313283 47.6406508603241)" | 2017-01-26T00:12:00.0000000Z |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |

Masukan Data Referensi:

| Equipment_id | Equipment_lease_location |
| --- | --- |
| 1 | "POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))" |

Output:

| Equipment_id | Equipment_alert_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
SELECT
	input.Equipment_id AS Equipment_id,
	input.Equipment_current_location AS Equipment_current_location,
	input.Time AS Time
FROM input TIMESTAMP BY time
JOIN
	referenceInput 
	ON input.Equipment_id = referenceInput.Equipment_id
	WHERE 
		ST_WITHIN(input.Equipment_currenct_location, referenceInput.Equipment_lease_location) = 1

Kueri memungkinkan pabrikan untuk memantau lokasi mesin secara otomatis, mendapatkan peringatan saat mesin meninggalkan geofence yang diizinkan. Fungsi geospasial bawaan memungkinkan pengguna untuk menggunakan data GPS dalam kueri tanpa perpustakaan pihak ketiga.

Untuk informasi selengkapnya, lihat artikel Skenario geofencing dan agregasi geospasial dengan Azure Stream Analytics.

Dapatkan bantuan

Untuk bantuan lebih lanjut, coba halaman pertanyaan Microsoft Q&A untuk Azure Stream Analytics.

Langkah berikutnya