Typowe wzorce zapytań w usłudze Azure Stream Analytics

Zapytania w usłudze Azure Stream Analytics są wyrażane w języku zapytań przypominającym SQL. Konstrukcje języka są udokumentowane w przewodniku referencyjnym języka zapytań usługi Stream Analytics.

Projekt zapytania może wyrażać prostą logikę przekazywania w celu przeniesienia danych zdarzeń z jednego strumienia wejściowego do wyjściowego magazynu danych lub może wykonywać zaawansowane dopasowywanie wzorców i analizę czasową w celu obliczania agregacji w różnych oknach czasu, jak w przewodniku Tworzenie rozwiązania IoT przy użyciu usługi Stream Analytics . Możesz łączyć dane z wielu danych wejściowych w celu łączenia zdarzeń przesyłania strumieniowego i wykonywać wyszukiwania względem statycznych danych referencyjnych w celu wzbogacania wartości zdarzeń. Możesz również zapisywać dane w wielu danych wyjściowych.

W tym artykule opisano rozwiązania kilku typowych wzorców zapytań opartych na rzeczywistych scenariuszach.

Obsługiwane formaty danych

Usługa Azure Stream Analytics obsługuje przetwarzanie zdarzeń w formatach danych CSV, JSON i Avro. Formaty JSON i Avro mogą zawierać złożone typy, takie jak zagnieżdżone obiekty (rekordy) lub tablice. Aby uzyskać więcej informacji na temat pracy z tymi złożonymi typami danych, zobacz Analizowanie danych JSON i AVRO.

Wysyłanie danych do wielu danych wyjściowych

Wiele instrukcji SELECT może służyć do wyprowadzania danych do różnych ujść danych wyjściowych. Na przykład jedna instrukcja SELECT może wyświetlić alert oparty na wartości progowej, podczas gdy inny może zwracać zdarzenia do magazynu obiektów blob.

Rozważ następujące dane wejściowe:

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

Chcesz również uzyskać następujące dwa dane wyjściowe z zapytania:

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 |

Zapytanie z dwiema instrukcjami SELECT z danymi wyjściowymi Archiwum i Danymi wyjściowymi alertu jako danymi wyjściowymi:

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

Klauzula INTO informuje usługę Stream Analytics, która z danych wyjściowych ma zapisywać dane. Pierwszy element SELECT definiuje zapytanie przekazywane, które odbiera dane z danych wejściowych i wysyła je do danych wyjściowych o nazwie ArchiveOutput. Drugie zapytanie agreguje i filtruje dane przed wysłaniem wyników do danych wyjściowych systemu alertów podrzędnych o nazwie AlertOutput.

Klauzulę WITH można użyć do zdefiniowania wielu bloków podzapytania. Ta opcja ma korzyść z otwierania mniejszej liczby czytników w źródle wejściowym.

Zapytanie:

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

Aby uzyskać więcej informacji, zobacz KLAUZULA WITH.

Proste zapytanie przekazywane

Proste zapytanie przekazywane może służyć do kopiowania danych strumienia wejściowego do danych wyjściowych. Jeśli na przykład strumień danych zawierających informacje o pojeździe w czasie rzeczywistym musi zostać zapisany w bazie danych SQL w celu późniejszej analizy, proste zapytanie przekazywane wykonuje zadanie.

Rozważ następujące dane wejściowe:

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

Dane wyjściowe mają być takie same jak dane wejściowe:

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

Oto zapytanie:

SELECT
	*
INTO Output
FROM Input

To polecenie SELECT * wysyła zapytania do wszystkich pól zdarzenia przychodzącego i wysyła je do danych wyjściowych. Zamiast tego można projektować tylko wymagane pola w instrukcji SELECT . W poniższym przykładzie instrukcja SELECT projektuje tylko pola Make (Make ) i Time (Czas ) z danych wejściowych.

Rozważ następujące dane wejściowe:

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

Chcesz, aby dane wyjściowe miały tylko pola Make (Make) i Time (Czas):

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

Oto zapytanie, które projektuje tylko wymagane pola:

SELECT
	Make, Time
INTO Output
FROM Input

Dopasowywanie ciągów z ciągiem LIKE i NOT LIKE

Like i NOT LIKE można użyć do sprawdzenia, czy pole pasuje do określonego wzorca. Na przykład można użyć filtru, aby zwrócić tylko tablice rejestracyjne rozpoczynające się literą i kończące się A cyfrą 9.

Rozważ następujące dane wejściowe:

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

Chcesz, aby dane wyjściowe miały tablice rejestracyjne rozpoczynające się literą A i kończące się cyfrą 9:

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

Oto zapytanie korzystające z operatora LIKE:

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

Użyj instrukcji LIKE , aby sprawdzić wartość pola License_plate . Powinna zaczynać się od litery A, a następnie mieć dowolny ciąg zero lub więcej znaków, kończąc się cyfrą 9.

Obliczanie w przypadku przeszłych zdarzeń

Funkcja LAG może służyć do wyszukiwania przeszłych zdarzeń w przedziale czasu i porównywania ich z bieżącym zdarzeniem. Na przykład zrobić z bieżącego samochodu może być wyprowadzony, jeśli różni się od ostatniej marki samochodu, który przeszedł przez stoisko płatne.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Użyj funkcji LAG , aby zajrzeć do strumienia wejściowego o jedno zdarzenie z powrotem, pobrać wartość Make i porównać ją z wartością Make bieżącego zdarzenia i wyświetlić zdarzenie.

Aby uzyskać więcej informacji, zobacz LAG.

Zwraca ostatnie zdarzenie w oknie

Ponieważ zdarzenia są używane przez system w czasie rzeczywistym, nie ma funkcji, która może określić, czy zdarzenie jest ostatnim do odebrania dla tego przedziału czasu. Aby to osiągnąć, strumień wejściowy musi być przyłączony do innego, gdzie czas zdarzenia jest maksymalnym czasem dla wszystkich zdarzeń w tym oknie.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe z informacjami o ostatnich samochodach w dwóch dziesięciomnutowych oknach czasu:

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

Przykładowe zapytanie:

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

Pierwszy krok zapytania zawiera maksymalną sygnaturę czasową w 10-minutowych oknach, czyli sygnaturę czasową ostatniego zdarzenia dla tego okna. Drugi krok łączy wyniki pierwszego zapytania z oryginalnym strumieniem, aby znaleźć zdarzenie zgodne z ostatnimi sygnaturami czasu w każdym oknie.

DATEDIFF to funkcja specyficzna dla daty, która porównuje i zwraca różnicę czasu między dwoma polami DateTime, aby uzyskać więcej informacji, zobacz funkcje daty.

Aby uzyskać więcej informacji na temat dołączania strumieni, zobacz JOIN.

Agregacja danych w czasie

Aby obliczyć informacje w przedziale czasu, można agregować dane. W tym przykładzie instrukcja oblicza liczbę w ciągu ostatnich 10 sekund czasu dla każdej konkretnej jednostki samochodu.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Zapytanie:

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

Ta agregacja grupuje samochody według marki Make i liczy je co 10 sekund. Dane wyjściowe mają Make i Count samochodów, które przeszły przez stoisko płatne.

TumblingWindow to funkcja okien używana do grupowania zdarzeń. Agregację można zastosować we wszystkich zdarzeniach zgrupowanych. Aby uzyskać więcej informacji, zobacz funkcje obsługi okien.

Aby uzyskać więcej informacji na temat agregacji, zobacz funkcje agregujące.

Okresowo wyjściowe wartości

W przypadku braku lub nieregularnych zdarzeń dane wyjściowe z regularnych interwałów mogą być generowane na podstawie bardziej rozrzedzonych danych wejściowych. Na przykład generuj zdarzenie co 5 sekund, które zgłasza ostatnio widoczny punkt danych.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe (pierwsze 10 wierszy):

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

Przykładowe zapytanie:

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)

To zapytanie generuje zdarzenia co 5 sekund i generuje ostatnie zdarzenie, które zostało wcześniej odebrane. Czas trwania HOPPINGWINDOW określa, jak daleko wstecz wygląda zapytanie, aby znaleźć najnowsze zdarzenie.

Aby uzyskać więcej informacji, zobacz Okno przeskoku.

Korelowanie zdarzeń w strumieniu

Korelowanie zdarzeń w tym samym strumieniu może odbywać się przez przyjrzenie się przeszłym zdarzeń za pomocą funkcji LAG . Na przykład dane wyjściowe mogą być generowane za każdym razem, gdy dwa kolejne samochody z tego samego make przejść przez stoisko płatne w ciągu ostatnich 90 sekund.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Funkcja LAG może przyjrzeć się strumieniu wejściowemu z powrotem jedno zdarzenie i pobrać wartość Make, porównując je z wartością Make bieżącego zdarzenia. Po spełnieniu warunku dane z poprzedniego zdarzenia mogą być projektowane przy użyciu funkcji LAG w instrukcji SELECT .

Aby uzyskać więcej informacji, zobacz LAG.

Wykrywanie czasu trwania między zdarzeniami

Czas trwania zdarzenia można obliczyć, sprawdzając ostatnie zdarzenie rozpoczęcia po odebraniu zdarzenia końcowego. To zapytanie może być przydatne do określenia czasu spędzanego przez użytkownika na stronie lub funkcji.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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'

Funkcja LAST może służyć do pobierania ostatniego zdarzenia w określonym warunku. W tym przykładzie warunek jest zdarzeniem typu Start, partycjonowaniem wyszukiwania według użytkownika i funkcji PARTITION BY . Dzięki temu każdy użytkownik i funkcja są traktowane niezależnie podczas wyszukiwania zdarzenia Start. LIMIT CZASU TRWANIA ogranicza wyszukiwanie z powrotem do 1 godziny między zdarzeniami End i Start.

Zlicz unikatowe wartości

Funkcja COUNT i DISTINCT może służyć do zliczenia liczby unikatowych wartości pól wyświetlanych w strumieniu w przedziale czasu. Możesz utworzyć zapytanie, aby obliczyć, ile unikatowych samochodów przejeżdżało przez stoisko płatne w 2-sekundowym oknie.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Funkcja COUNT(DISTINCT Make) zwraca liczbę unikatowych wartości w kolumnie Make w przedziale czasu. Aby uzyskać więcej informacji, zobacz FUNKCJA agregacji COUNT.

Pobieranie pierwszego zdarzenia w oknie

Możesz użyć IsFirst polecenia , aby pobrać pierwsze zdarzenie w przedziale czasu. Na przykład wyprowadzanie informacji o pierwszym samochodzie co 10-minutowy interwał.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

IsFirst może również podzielić dane na partycje i obliczyć pierwsze zdarzenie do każdego konkretnego samochodu Make znalezionego co 10-minutowy interwał.

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Aby uzyskać więcej informacji, zobacz IsFirst.

Usuwanie zduplikowanych zdarzeń w oknie

Podczas wykonywania operacji, takiej jak obliczanie średnich względem zdarzeń w danym przedziale czasu, należy filtrować zduplikowane zdarzenia. W poniższym przykładzie drugie zdarzenie jest duplikatem pierwszego.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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)

Po wykonaniu pierwszej instrukcji zduplikowane rekordy są łączone w jeden, ponieważ wszystkie pola w klauzuli group by są takie same. W związku z tym usuwa duplikaty.

Określanie logiki dla różnych przypadków/wartości (instrukcje CASE)

Instrukcje CASE mogą udostępniać różne obliczenia dla różnych pól na podstawie określonego kryterium. Na przykład przypisz pas ruchu A do samochodów Make1 i pasa ruchu B do dowolnej innej marki.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Wyrażenie CASE porównuje wyrażenie z zestawem prostych wyrażeń w celu określenia jego wyniku. W tym przykładzie pojazdy są wysyłane do pasa Make1 ruchu A , podczas gdy pojazdy dowolnego innego typu będą miały przypisany pas ruchu B.

Aby uzyskać więcej informacji, zobacz wyrażenie wielkości liter.

Konwersja danych

Dane można rzutować w czasie rzeczywistym przy użyciu metody CAST . Na przykład waga samochodu można przekonwertować z typu nvarchar(max) na typ bigint i być używany w obliczeniach liczbowych.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Użyj instrukcji CAST , aby określić jej typ danych. Zobacz listę obsługiwanych typów danych na temat typów danych (Azure Stream Analytics).

Aby uzyskać więcej informacji na temat funkcji konwersji danych.

Wykrywanie czasu trwania warunku

W przypadku warunków obejmujących wiele zdarzeń funkcja LAG może służyć do identyfikowania czasu trwania tego warunku. Załóżmy na przykład, że usterka spowodowała, że wszystkie samochody mają nieprawidłową wagę (powyżej 20 000 funtów), a czas trwania tej usterki musi zostać obliczony.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Pierwsza instrukcja SELECT koreluje bieżącą miarę wagi z poprzednią miarą, wyświetlając ją razem z bieżącą miarą. Drugi element SELECT powraca do ostatniego zdarzenia, w którym previous_weight jest mniejszy niż 20000, gdzie bieżąca waga jest mniejsza niż 20000, a previous_weight bieżącego zdarzenia był większy niż 20000.

End_fault jest bieżącym zdarzeniem nonfaulty, w którym poprzednie zdarzenie było uszkodzone, a Start_fault jest ostatnim zdarzeniem nonfaulty przed tym.

Przetwarzanie zdarzeń z niezależnym czasem (podstreamy)

Zdarzenia mogą pojawiać się późno lub poza kolejnością z powodu niesymetryczności zegara między producentami zdarzeń, niesymetryczności zegara między partycjami lub opóźnieniami sieci. Na przykład zegar urządzenia tollID 2 wynosi pięć sekund za TollID 1, a zegar urządzenia tollID 3 wynosi 10 sekund za TollID 1. Obliczenia mogą odbywać się niezależnie dla każdego opłaty, biorąc pod uwagę tylko własne dane zegarowe jako znacznik czasu.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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

Klauzula TIMESTAMP OVER BY sprawdza niezależnie każdą oś czasu urządzenia przy użyciu podstreamów. Zdarzenie wyjściowe dla każdego identyfikatora TollID jest generowane, ponieważ są obliczane, co oznacza, że zdarzenia są uporządkowane w odniesieniu do każdego identyfikatora TollID zamiast zmiany kolejności tak, jakby wszystkie urządzenia były na tym samym zegarze.

Aby uzyskać więcej informacji, zobacz TIMESTAMP BY OVER.

Sesja systemu Windows

Okno sesji to okno, które ciągle rozwija się w miarę występowania zdarzeń i zamyka obliczenia, jeśli żadne zdarzenie nie zostanie odebrane po upływie określonego czasu lub jeśli okno osiągnie maksymalny czas trwania. To okno jest szczególnie przydatne podczas przetwarzania danych interakcji użytkownika. Okno rozpoczyna się, gdy użytkownik rozpoczyna interakcję z systemem i zamyka się, gdy nie zaobserwowano więcej zdarzeń, co oznacza, że użytkownik przestał wchodzić w interakcję. Na przykład użytkownik wchodzi w interakcję ze stroną internetową, na której jest rejestrowana liczba kliknięć, można użyć okna sesji, aby dowiedzieć się, jak długo użytkownik wchodzi w interakcję z witryną.

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

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

Przykładowe zapytanie:

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)

Funkcja SELECT projektuje dane istotne dla interakcji użytkownika wraz z czasem trwania interakcji. Grupowanie danych według użytkownika i sesjiWindow , które zamyka się, jeśli żadna interakcja nie nastąpi w ciągu 1 minuty, z maksymalnym rozmiarem okna wynoszącym 60 minut.

Aby uzyskać więcej informacji na temat sesjiWindow, zobacz Okno sesji .

Funkcje zdefiniowane przez użytkownika w językach JavaScript i C#

Język zapytań usługi Azure Stream Analytics można rozszerzyć przy użyciu funkcji niestandardowych napisanych w języku JavaScript lub C#. Funkcje zdefiniowane przez użytkownika (UDF) to niestandardowe/złożone obliczenia, których nie można łatwo wyrazić przy użyciu języka SQL . Te funkcje zdefiniowane przez użytkownika można definiować raz i używać wiele razy w zapytaniu. Na przykład funkcja UDF może służyć do konwertowania wartości szesnastkowej nvarchar(max) na wartość bigint .

Przykładowe dane wejściowe:

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

Przykładowe dane wyjściowe:

| 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

Funkcja zdefiniowana przez użytkownika oblicza wartość bigint z wartości HexValue na każdym zużytych zdarzeń.

Aby uzyskać więcej informacji, zobacz JavaScript i C#.

Zaawansowane dopasowywanie wzorca za pomocą MATCH_RECOGNIZE

MATCH_RECOGNIZE to zaawansowany mechanizm dopasowywania wzorców, który może służyć do dopasowywania sekwencji zdarzeń do dobrze zdefiniowanego wzorca wyrażeń regularnych. Na przykład usługa ATM jest monitorowana w czasie rzeczywistym pod kątem awarii, podczas działania usługi ATM, jeśli istnieją dwa kolejne komunikaty ostrzegawcze, administrator musi zostać powiadomiony.

Dane wejściowe:

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

Dane wyjściowe:

| 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

To zapytanie pasuje do co najmniej dwóch kolejnych zdarzeń awarii i generuje alarm po spełnieniu warunków. Wzorzec definiuje wyrażenie regularne, które ma być używane w dopasowywaniu, w tym przypadku co najmniej dwa kolejne ostrzeżenia po co najmniej jednej pomyślnej operacji. Powodzenie i ostrzeżenie są definiowane przy użyciu wartości Return_Code, a po spełnieniu warunku miary są przewidywane przy użyciu ATM_id, pierwszej operacji ostrzeżenia i pierwszego ostrzeżenia.

Aby uzyskać więcej informacji, zobacz MATCH_RECOGNIZE.

Geofencing i zapytania geoprzestrzenne

Usługa Azure Stream Analytics udostępnia wbudowane funkcje geoprzestrzenne, które mogą służyć do implementowania scenariuszy, takich jak zarządzanie flotą, udostępnianie przejazdów, połączone samochody i śledzenie zasobów. Dane geoprzestrzenne można pozyskiwać w formatach GeoJSON lub WKT w ramach strumienia zdarzeń lub danych referencyjnych. Na przykład firma specjalizująca się w produkcji maszyn do drukowania paszportów, dzierżawi swoje maszyny rządom i konsulatom. Lokalizacja tych maszyn jest w dużym stopniu kontrolowana, aby uniknąć niewłaściwego stosowania i podrabiania paszportów. Każda maszyna jest wyposażona w tracker GPS, który informacje są przekazywane z powrotem do zadania usługi Azure Stream Analytics. Producent chce śledzić lokalizację tych maszyn i otrzymywać alerty, jeśli jeden z nich opuści autoryzowany obszar, w ten sposób mogą zdalnie wyłączyć, władze alarmowe i pobrać sprzęt.

Dane wejściowe:

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

Dane wejściowe danych referencyjnych:

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

Dane wyjściowe:

| 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

Zapytanie umożliwia producentowi automatyczne monitorowanie lokalizacji maszyn, automatyczne otrzymywanie alertów po opuszczeniu dozwolonego geofencingu przez maszynę. Wbudowana funkcja geoprzestrzenna umożliwia użytkownikom korzystanie z danych GPS w zapytaniu bez bibliotek innych firm.

Aby uzyskać więcej informacji, zobacz artykuł Geofencing and geospatial aggregation scenarios with Azure Stream Analytics (Scenariusze agregacji geoprzestrzennych w usłudze Azure Stream Analytics ).

Uzyskaj pomoc

Aby uzyskać dalszą pomoc, wypróbuj stronę pytań i odpowiedzi firmy Microsoft dotyczącą usługi Azure Stream Analytics.

Następne kroki