Azure Stream Analytics'te yaygın sorgu desenleri

Azure Stream Analytics'teki sorgular SQL benzeri bir sorgu dilinde gösterilir. Dil yapıları Stream Analytics sorgu dili başvuru kılavuzunda belgelenmiştir.

Sorgu tasarımı, olay verilerini bir giriş akışından çıkış veri deposuna taşımak için basit geçiş mantığını ifade edebilir veya Stream Analytics kullanarak IoT çözümü oluşturma kılavuzunda olduğu gibi çeşitli zaman pencerelerindeki toplamları hesaplamak için zengin desen eşleştirme ve zamansal analiz gerçekleştirebilir. Akış olaylarını birleştirmek için birden çok girişten verileri birleştirebilir ve olay değerlerini zenginleştirmek için statik başvuru verilerinde aramalar yapabilirsiniz. Ayrıca birden çok çıkışa veri yazabilirsiniz.

Bu makalede, gerçek dünya senaryolarını temel alan çeşitli yaygın sorgu desenlerinin çözümleri özetlenmiştir.

Desteklenen Veri Biçimleri

Azure Stream Analytics CSV, JSON ve Avro veri biçimlerinde olayları işlemeyi destekler. JSON ve Avro biçimleri iç içe nesneler (kayıtlar) veya diziler gibi karmaşık türler içerebilir. Bu karmaşık veri türleriyle çalışma hakkında daha fazla bilgi için bkz . JSON ve AVRO verilerini ayrıştırma.

Birden çok çıkışa veri gönderme

Farklı çıkış havuzlarına veri çıkışı yapmak için birden çok SELECT deyimi kullanılabilir. Örneğin, bir SELECT deyimi eşik tabanlı bir uyarının çıkışını verirken, bir diğeri blob depolamaya olay çıkışı yapabilir.

Aşağıdaki girişi göz önünde bulundurun:

| 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 |

Sorgudan aşağıdaki iki çıkışı istiyorsunuz:

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 |

Arşiv çıktısı ve Çıkış olarak Uyarı çıkışı içeren iki SELECT deyimi içeren sorgu:

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

INTO yan tümcesi Stream Analytics hizmetine verilerin yazıldığı çıkışları bildirir. İlk SELECT, girişten veri alan ve Bunu ArchiveOutput adlı çıkışa gönderen bir geçiş sorgusu tanımlar. İkinci sorgu, sonuçları AlertOutput adlı aşağı akış uyarı sistemi çıkışına göndermeden önce verileri toplar ve filtreler.

WITH yan tümcesi birden çok alt sorgu bloğu tanımlamak için kullanılabilir. Bu seçenek, giriş kaynağına daha az okuyucu açma avantajına sahiptir.

Sorgu:

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

Daha fazla bilgi için bkz . WITH yan tümcesi.

Basit geçiş sorgusu

Giriş akışı verilerini çıkışa kopyalamak için basit bir geçiş sorgusu kullanılabilir. Örneğin, gerçek zamanlı araç bilgilerini içeren bir veri akışının daha sonra analiz için bir SQL veritabanına kaydedilmesi gerekiyorsa, basit bir geçiş sorgusu işi yapar.

Aşağıdaki girişi göz önünde bulundurun:

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

Çıkışın girişle aynı olmasını istiyorsunuz:

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

Sorgu şu şekildedir:

SELECT
	*
INTO Output
FROM Input

Bu SELECT * sorgusu, gelen olayın tüm alanlarını projeler ve çıkışa gönderir. Bunun yerine, select deyiminde yalnızca gerekli alanları yansıtabilirsiniz. Aşağıdaki örnekte SELECT deyimi, giriş verilerinden yalnızca Make ve Time alanlarını projeler.

Aşağıdaki girişi göz önünde bulundurun:

| 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 |

Çıkışın yalnızca Make ve Time alanlarına sahip olmasını istiyorsunuz:

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

Yalnızca gerekli alanları projeleyen sorgu aşağıdadır:

SELECT
	Make, Time
INTO Output
FROM Input

LIKE ve NOT LIKE ile dize eşleştirme

LIKE ve NOT LIKE , bir alanın belirli bir desenle eşleşip eşleşmediğini doğrulamak için kullanılabilir. Örneğin, yalnızca harfle A başlayan ve numarasıyla 9biten lisans plakalarını döndürmek için bir filtre kullanabilirsiniz.

Aşağıdaki girişi göz önünde bulundurun:

| 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 |

Çıktının, harfle A başlayan ve numarasıyla 9biten lisans plakalarına sahip olmasını istiyorsunuz:

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

LIKE işlecini kullanan sorgu aşağıdadır:

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

License_plate alan değerini denetlemek için LIKE deyimini kullanın. harfiyle Abaşlamalıdır, ardından 9 sayısıyla biten sıfır veya daha fazla karakterden oluşan bir dizeye sahip olmalıdır.

Geçmiş olaylara göre hesaplama

LAG işlevi, bir zaman penceresinde geçmiş olaylara bakmak ve bunları geçerli olayla karşılaştırmak için kullanılabilir. Örneğin, ücretli kabinden geçen son arabanın markasından farklıysa geçerli arabanın markası çıkarılabilir.

Örnek giriş:

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

Örnek çıkış:

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

Örnek sorgu:

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

Giriş akışına bir olay geri göz atmak, Make değerini almak ve bunu geçerli olayın Make değeriyle karşılaştırmak ve olayın çıktısını almak için LAG kullanın.

Daha fazla bilgi için bkz . LAG.

Penceredeki son olayı döndürme

Olaylar sistem tarafından gerçek zamanlı olarak tüketildiğinden, bir olayın bu zaman penceresi için en son gelen olay olup olmadığını belirleyebilecek bir işlev yoktur. Bunu başarmak için giriş akışının, bir olayın zamanının bu penceredeki tüm olaylar için en uzun süre olduğu başka bir akışla birleştirilmesi gerekir.

Örnek giriş:

| 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 |

İki on dakikalık zaman pencerelerindeki son arabalar hakkında bilgi içeren örnek çıkış :

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

Örnek sorgu:

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

Sorgudaki ilk adım, 10 dakikalık pencerelerde maksimum zaman damgasını, yani bu pencere için son olayın zaman damgasını bulur. İkinci adım, her penceredeki son zaman damgalarıyla eşleşen olayı bulmak için ilk sorgunun sonuçlarını özgün akışla birleştirir.

DATEDIFF , iki DateTime alanı arasındaki zaman farkını karşılaştıran ve döndüren tarihe özgü bir işlevdir. Daha fazla bilgi için bkz . tarih işlevleri.

Akışları birleştirme hakkında daha fazla bilgi için bkz . JOIN.

Zaman içinde veri toplama

Zaman penceresinde bilgi hesaplamak için verileri toplayabilirsiniz. Bu örnekte deyimi, bir arabanın belirli bir markası için son 10 saniye içindeki bir sayıyı hesaplar.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Sorgu:

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

Bu toplama, arabaları Make ölçütüne göre gruplandırıyor ve her 10 saniyede bir sayıyor. Çıkış, ücretli standdan geçen arabaların Make ve Count'una sahiptir.

TumblingWindow, olayları birlikte gruplandırmak için kullanılan bir pencereleme işlevidir. Bir toplama, tüm gruplandırılmış olaylara uygulanabilir. Daha fazla bilgi için bkz . pencere işlevleri.

Toplama hakkında daha fazla bilgi için bkz . toplama işlevleri.

Değerleri düzenli aralıklarla çıktı olarak verir

Olaylar eksik veya düzensiz olduğunda, daha seyrek bir veri girişinden düzenli aralık çıkışı oluşturulabilir. Örneğin, her 5 saniyede bir en son görülen veri noktasını bildiren bir olay oluşturun.

Örnek giriş:

| 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 |

Örnek çıktı (ilk 10 satır):

| 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 |

Örnek sorgu:

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)

Bu sorgu her 5 saniyede bir olay oluşturur ve daha önce alınan son olayı üretir. HOPPINGWINDOW süresi, sorgunun en son olayı bulmak için ne kadar geriye doğru göründüğünü belirler.

Daha fazla bilgi için bkz . Atlama penceresi.

Akıştaki olayları ilişkilendirme

Aynı akıştaki olayları ilişkilendirmek için LAG işlevini kullanarak geçmiş olaylara bakabilirsiniz. Örneğin, son 90 saniye içinde aynı Make'ten art arda iki araba ücretli standdan geçtiğinde bir çıkış oluşturulabilir.

Örnek giriş:

| 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 |

Örnek çıkış:

| 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 |

Örnek sorgu:

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

LAG işlevi giriş akışına bir olay geri bakabilir ve Make değerini alabilir ve bunu geçerli olayın Make değeriyle karşılaştırabilir. Koşul karşılandıktan sonra, select deyimindeki LAG kullanılarak önceki olaya ait veriler yansıtılabilir.

Daha fazla bilgi için bkz . LAG.

Olaylar arasındaki süreyi algılama

Bir Bitiş olayı alındıktan sonra son Başlangıç olayına bakılarak bir olayın süresi hesaplanabilir. Bu sorgu, kullanıcının bir sayfada veya özellikte harcadığı zamanı belirlemek için yararlı olabilir.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Örnek sorgu:

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'

LAST işlevi, belirli bir koşuldaki son olayı almak için kullanılabilir. Bu örnekte koşul, aramayı PARTITION BY kullanıcı ve özelliğine göre bölümleyerek Başlangıç türünde bir olaydır. Bu şekilde, Başlat olayı aranırken her kullanıcı ve özellik bağımsız olarak değerlendirilir. SINIR SÜRESİ , aramayı Bitiş ve Başlangıç olayları arasında 1 saatle sınırlar.

Benzersiz değerleri sayma

COUNT ve DISTINCT , bir zaman penceresi içinde akışta görünen benzersiz alan değerlerinin sayısını saymak için kullanılabilir. 2 saniyelik bir pencerede ücretli standdan kaç adet benzersiz Otomobil Yapımı'nın geçtiğini hesaplamak için bir sorgu oluşturabilirsiniz.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Örnek sorgu:

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

BAĞ_DEĞ_SAY(DISTINCT Make), bir zaman penceresindeki Make sütunundaki ayrı değerlerin sayısını döndürür. Daha fazla bilgi için bkz . BAĞ_DEĞ_SAY toplama işlevi.

Penceredeki ilk olayı alma

Bir zaman penceresindeki ilk olayı almak için kullanabilirsiniz IsFirst . Örneğin, ilk araba bilgilerini her 10 dakikada bir çıktı olarak çıkarma.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Örnek sorgu:

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

IsFirst ayrıca verileri bölümlere ayırabilir ve her 10 dakikalık aralıkta bulunan her araba için ilk olayı hesaplayabilir.

Örnek çıkış:

| 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 |

Örnek sorgu:

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

Daha fazla bilgi için bkz . IsFirst.

Pencerede yinelenen olayları kaldırma

Belirli bir zaman penceresindeki olayların ortalamalarını hesaplama gibi bir işlem gerçekleştirdiğinizde, yinelenen olaylar filtrelenmelidir. Aşağıdaki örnekte, ikinci olay birincinin bir kopyasıdır.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Örnek sorgu:

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)

İlk deyim yürütürken, yinelenen kayıtlar group by yan tümcesindeki alanların tümü aynı olduğundan tek bir kayıtta birleştirilir. Bu nedenle, yinelenenleri kaldırır.

Farklı servis talepleri/değerler için mantık belirtme (CASE deyimleri)

CASE deyimleri, belirli ölçütlere göre farklı alanlar için farklı hesaplamalar sağlayabilir. Örneğin, diğer herhangi bir türe ait A arabalara Make1 ve şeritlere şerit B atayın.

Örnek giriş:

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

Örnek çıkış:

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

Örnek sorgu:

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

CASE ifadesi, sonucunu belirlemek için bir ifadeyi bir dizi basit ifadeyle karşılaştırır. Bu örnekte, araçları Make1 şeride A gönderilirken, diğer herhangi bir makete ait araçlara şerit Batanır.

Daha fazla bilgi için bkz . büyük/küçük harf ifadesi.

Veri dönüştürme

VERILER CAST yöntemi kullanılarak gerçek zamanlı olarak yayınlanabilir. Örneğin, araba ağırlığı nvarchar(max) türünden bigint türüne dönüştürülebilir ve sayısal bir hesaplamada kullanılabilir.

Örnek giriş:

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

Örnek çıkış:

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

Örnek sorgu:

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

Veri türünü belirtmek için CAST deyimini kullanın. Veri türleri (Azure Stream Analytics) ile ilgili desteklenen veri türlerinin listesine bakın.

Veri dönüştürme işlevleri hakkında daha fazla bilgi için.

Koşulun süresini algılama

Birden çok olaya yayılan koşullar için LAG işlevi, bu koşulun süresini tanımlamak için kullanılabilir. Örneğin, bir hatanın tüm otomobillerin yanlış ağırlığa (20.000 pound'un üzerinde) neden olduğunu ve bu hatanın süresinin hesaplanması gerektiğini varsayalım.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Örnek sorgu:

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

İlk SELECT deyimi, geçerli ağırlık ölçümlerini önceki ölçümle ilişkilendirerek geçerli ölçümle bir araya getirir. İkinci SELECT, previous_weight 20000'den küçük olduğu ve geçerli ağırlığın 20000'den küçük olduğu ve geçerli olayın previous_weight 20000'den büyük olduğu son olaya geri döner.

End_fault, önceki olayın hatalı olduğu geçerli hatalı olmayan olaydır ve Start_fault bundan önceki son hatalı olmayan olaydır.

Bağımsız zaman ile olayları işleme (Alt Akışlar)

Olay üreticileri arasındaki saat dengesizliği, bölümler arasındaki saat dengesizliği veya ağ gecikmesi nedeniyle olaylar geç gelebilir veya sıra dışı olabilir. Örneğin, TollID 2 için cihaz saati TollID 1'in beş saniye gerisindedir ve TollID 3 için cihaz saati TollID 1'in 10 saniye gerisindedir. Hesaplama, yalnızca kendi saat verilerini zaman damgası olarak dikkate alarak her geçiş ücreti için bağımsız olarak gerçekleşebilir.

Örnek giriş:

| 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 |

Örnek çıkış:

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

Örnek sorgu:

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

TIMESTAMP OVER BY yan tümcesi, alt akışları kullanarak her cihaz zaman çizelgesine bağımsız olarak bakar. Her Bir TollID için çıkış olayı hesaplandıklarında oluşturulur, yani tüm cihazlar aynı saat üzerindeymiş gibi yeniden sıralanmaları yerine olayların her TollID'ye göre sıralandığı anlamına gelir.

Daha fazla bilgi için bkz . TIMESTAMP BY OVER.

Oturum Pencereleri

Oturum penceresi, olaylar gerçekleştikçe genişlemeye devam eden ve belirli bir süre sonra olay alınmazsa veya pencere en uzun süreye ulaşırsa hesaplama için kapanan bir penceredir. Bu pencere özellikle kullanıcı etkileşim verileri hesaplanırken kullanışlıdır. Bir pencere, kullanıcı sistemle etkileşime geçtiğinde başlar ve daha fazla olay gözlemlenmediğinde kapanır; başka bir deyişle kullanıcı etkileşim kurmayı durdurdu. Örneğin, kullanıcı tıklama sayısının günlüğe kaydedildiği bir web sayfasıyla etkileşimde bulunur. Kullanıcının siteyle ne kadar süre etkileşimde olduğunu öğrenmek için Oturum Penceresi kullanılabilir.

Örnek giriş:

| 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" |

Örnek çıkış:

| 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 |

Örnek sorgu:

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)

SELECT, kullanıcı etkileşimiyle ilgili verileri, etkileşimin süresiyle birlikte projeler. Verileri kullanıcıya göre gruplandırma ve 1 dakika içinde hiçbir etkileşim gerçekleşmezse kapanan SessionWindow ve maksimum pencere boyutu 60 dakikadır.

SessionWindow hakkında daha fazla bilgi için bkz. Oturum Penceresi .

JavaScript ve C'de kullanıcı tanımlı işlevler#

Azure Stream Analytics sorgu dili, JavaScript veya C# dilinde yazılmış özel işlevlerle genişletilebilir. Kullanıcı Tanımlı İşlevler (UDF), SQL dili kullanılarak kolayca ifade edilebilen özel/karmaşık hesaplamalardır. Bu UDF'ler bir kez tanımlanabilir ve sorgu içinde birden çok kez kullanılabilir. Örneğin UDF, onaltılık nvarchar(max) değerini bigint değerine dönüştürmek için kullanılabilir.

Örnek giriş:

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

Örnek çıkış:

| 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

Kullanıcı Tanımlı İşlev, tüketilen her olayda HexValue değerinden bigint değerini hesaplar.

Daha fazla bilgi için bkz . JavaScript ve C#.

MATCH_RECOGNIZE ile gelişmiş desen eşleştirme

MATCH_RECOGNIZE, bir olay dizisini iyi tanımlanmış bir normal ifade deseni ile eşleştirmek için kullanılabilecek gelişmiş bir desen eşleştirme mekanizmasıdır. Örneğin, atm hatalara karşı gerçek zamanlı olarak izlenmekte olup, atm işlemi sırasında yöneticiye bildirilmesi gereken iki ardışık uyarı iletisi varsa.

Giriş:

| 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 |

Çıkış:

| 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

Bu sorgu en az iki ardışık hata olayıyla eşleşir ve koşullar karşılandığında bir alarm oluşturur. PATTERN , eşleştirmede kullanılacak normal ifadeyi tanımlar; bu durumda, en az bir başarılı işlemden sonra en az iki ardışık uyarı. Başarı ve Uyarı Return_Code değer kullanılarak tanımlanır ve koşul karşılandıktan sonra ÖLÇÜLER ATM_id, ilk uyarı işlemi ve ilk uyarı zamanı ile yansıtılır.

Daha fazla bilgi için bkz . MATCH_RECOGNIZE.

Coğrafi sınırlama ve jeo-uzamsal sorgular

Azure Stream Analytics, filo yönetimi, sürüş paylaşımı, bağlı arabalar ve varlık izleme gibi senaryoları uygulamak için kullanılabilecek yerleşik jeo-uzamsal işlevler sağlar. Jeo-uzamsal veriler, olay akışı veya başvuru verilerinin bir parçası olarak GeoJSON veya WKT biçimlerinde alınabiliyor. Örneğin, pasaport yazdırmak için makine üretiminde uzmanlaşmış bir şirket, makinelerini hükümetlere ve konsolosluklara kiralar. Bu makinelerin konumu, pasaportların hatalı dağıtılmasını ve sahtecilik için olası kullanımı önlemek için yoğun bir şekilde denetlenmektedir. Her makine bir GPS izleyicisiyle donatılmıştır ve bu bilgiler bir Azure Stream Analytics işine geri iletilir. Üretim, bu makinelerin konumunu takip etmek ve bunlardan biri yetkili bir alandan ayrılırsa uyarı almak istiyor, bu şekilde uzaktan devre dışı bırakabilir, yetkilileri uyarabilir ve ekipmanı alabilir.

Giriş:

| 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 |

Başvuru Veri Girişi:

| 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))" |

Çıkış:

| 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

Sorgu, üreticinin makine konumunu otomatik olarak izlemesine olanak tanır ve bir makine izin verilen bölge sınırından ayrıldığında uyarılar alır. Yerleşik jeo-uzamsal işlev, kullanıcıların üçüncü taraf kitaplıkları olmadan sorgudaki GPS verilerini kullanmasına olanak tanır.

Daha fazla bilgi için Azure Stream Analytics ile coğrafi sınırlama ve jeo-uzamsal toplama senaryoları makalesine bakın.

Yardım alın

Daha fazla yardım için Azure Stream Analytics için Microsoft Soru-Cevap soru sayfamızı deneyin.

Sonraki adımlar