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 język SQL. Konstrukcje językowe są udokumentowane w przewodniku referencyjnym języka zapytań usługi Stream Analytics .

Projekt zapytania może wyrażać prostą logikę przekazywania, aby przenieść dane 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 połączyć dane z wielu danych wejściowych w celu połączenia zdarzeń przesyłania strumieniowego i wykonywać wyszukiwania względem statycznych danych referencyjnych w celu wzbogacenia 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.

Zarówno JSON, jak i Avro mogą zawierać typy złożone, 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 artykuł 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 jeden element SELECT może wygenerować alert oparty na progach, podczas gdy inny może wyprowadzać zdarzenia do magazynu obiektów blob.

Dane wejściowe:

Marka Godzina
Make1 2015-01-01T00:00:01Z
Make1 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:01Z
Make2 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:03Z

Dane wyjściowe ArchiveOutput:

Marka Godzina
Make1 2015-01-01T00:00:01Z
Make1 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:01Z
Make2 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:03Z

Wyjściowy alertOutput:

Marka Godzina Liczba
Make2 2015-01-01T00:00:10Z 3

Zapytanie:

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, do której dane wyjściowe mają być zapisywane. 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 wykonuje prostą agregację i filtrowanie przed wysłaniem wyników do danych wyjściowych systemu alertów podrzędnych o nazwie AlertOutput.

Należy pamiętać, że klauzula WITH może służyć do definiowania 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 klauzulę 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 pojazdach w czasie rzeczywistym musi zostać zapisany w bazie danych SQL na potrzeby późniejszej analizy, proste zapytanie przekazywane wykona to zadanie.

Dane wejściowe:

Marka Godzina Waga
Make1 2015-01-01T00:00:01Z "1000"
Make1 2015-01-01T00:00:02Z "2000"

Dane wyjściowe:

Marka Godzina Waga
Make1 2015-01-01T00:00:01Z "1000"
Make1 2015-01-01T00:00:02Z "2000"

Zapytanie:

SELECT
	*
INTO Output
FROM Input

Zapytanie SELECT * projektuje wszystkie pola zdarzenia przychodzącego i wysyła je do danych wyjściowych. W ten sam sposób funkcja SELECT może również służyć do projekcji tylko wymaganych pól z danych wejściowych. W tym przykładzie, jeśli pojazd Make i Time są jedynymi polami wymaganymi do zapisania, te pola można określić w instrukcji SELECT .

Dane wejściowe:

Marka Godzina Waga
Make1 2015-01-01T00:00:01Z 1000
Make1 2015-01-01T00:00:02Z 2000
Make2 2015-01-01T00:00:04Z 1500

Dane wyjściowe:

Marka Godzina
Make1 2015-01-01T00:00:01Z
Make1 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:04Z

Zapytanie:

SELECT
	Make, Time
INTO Output
FROM Input

Dopasowywanie ciągów z ciągami 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 utworzyć filtr, aby zwrócić tylko tablice rejestracyjne rozpoczynające się literą "A" i kończyć się cyfrą 9.

Dane wejściowe:

Marka License_plate Godzina
Make1 ABC-123 2015-01-01T00:00:01Z
Make2 AAA-999 2015-01-01T00:00:02Z
Make3 ABC-369 2015-01-01T00:00:03Z

Dane wyjściowe:

Marka License_plate Godzina
Make2 AAA-999 2015-01-01T00:00:02Z
Make3 ABC-369 2015-01-01T00:00:03Z

Zapytanie:

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 zer lub więcej znaków, kończąc się cyfrą 9.

Obliczanie w poprzednich zdarzeniach

Funkcja LAG może służyć do przyjrzenia się przeszłym zdarzeniu w przedziale czasu i porównać je z bieżącym zdarzeniem. Na przykład bieżąca firma samochodowa może być wyprowadzona, jeśli różni się od ostatniego samochodu, który przeszedł przez opłaty.

Dane wejściowe:

Marka Godzina
Make1 2015-01-01T00:00:01Z
Make2 2015-01-01T00:00:02Z

Dane wyjściowe:

Marka Godzina
Make2 2015-01-01T00:00:02Z

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 z powrotem jednego zdarzenia, pobierając wartość Make i porównując ją z wartością Make bieżącego zdarzenia i wyprowadzając 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 będzie ostatnim, który zostanie dostarczony przez ten przedział czasu. Aby to osiągnąć, strumień wejściowy musi być przyłączony do innego, w którym czas zdarzenia jest maksymalnym czasem dla wszystkich zdarzeń w tym oknie.

Dane wejściowe:

License_plate Marka Godzina
DXE 5291 Make1 2015-07-27T00:00:05Z
YZK 5704 Make3 2015-07-27T00:02:17Z
RMV 8282 Make1 2015-07-27T00:05:01Z
YHN 6970 Make2 2015-07-27T00:06:00Z
VFE 1616 Make2 2015-07-27T00:09:31Z
QYF 9358 Make1 2015-07-27T00:12:02Z
MDR 6128 Utwórz 4 2015-07-27T00:13:45Z

Dane wyjściowe:

License_plate Marka Godzina
VFE 1616 Make2 2015-07-27T00:09:31Z
MDR 6128 Utwórz 4 2015-07-27T00:13:45Z

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

Pierwszym krokiem zapytania jest znalezienie maksymalnej sygnatury czasowej w 10-minutowych oknach, czyli sygnatury czasowej 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, dane można agregować razem. W tym przykładzie liczba jest obliczana w ciągu ostatnich 10 sekund czasu dla każdego konkretnego samochodu.

Dane wejściowe:

Marka Godzina Waga
Make1 2015-01-01T00:00:01Z 1000
Make1 2015-01-01T00:00:02Z 2000
Make2 2015-01-01T00:00:04Z 1500

Dane wyjściowe:

Marka Liczba
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 pozycji Make i zlicza je co 10 sekund. Dane wyjściowe mają Make and Count samochodów, które przeszły przez opłaty.

TumblingWindow to funkcja okien używana do grupowania zdarzeń. Agregacja może być stosowana we wszystkich zdarzeniach pogrupowanych. Aby uzyskać więcej informacji, zobacz funkcje okien.

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

Okresowo wartości wyjściowe

W przypadku nieregularnych lub brakujących zdarzeń można wygenerować regularne dane wyjściowe interwału na podstawie bardziej rozrzedzonych danych wejściowych. Na przykład generuj zdarzenie co 5 sekund, które zgłasza ostatnio widoczny punkt danych.

Dane wejściowe:

Godzina Wartość
"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

Dane wyjściowe (pierwsze 10 wierszy):

Window_end Last_event. Czas Last_event. Wartość
2014-01-01T14:01:00Z 2014-01-01T14:01:00Z 1
2014-01-01T14:01:05Z 2014-01-01T14:01:05Z 2
2014-01-01T14:01:10Z 2014-01-01T14:01:10Z 3
2014-01-01T14:01:15Z 2014-01-01T14:01:15Z 4
2014-01-01T14:01:20Z 2014-01-01T14:01:15Z 4
2014-01-01T14:01:25Z 2014-01-01T14:01:15Z 4
2014-01-01T14:01:30Z 2014-01-01T14:01:30Z 5
2014-01-01T14:01:35Z 2014-01-01T14:01:35Z 6
2014-01-01T14:01:40Z 2014-01-01T14:01:35Z 6
2014-01-01T14:01:45Z 2014-01-01T14:01:35Z 6

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 odebrane wcześniej. Czas trwania HOPPINGWINDOW określa, jak daleko z powrotem zapytanie szuka najnowszego zdarzenia.

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

Skorelowanie zdarzeń w strumieniu

Korelowanie zdarzeń w tym samym strumieniu można wykonać, przeglądając poprzednie zdarzenia przy użyciu funkcji LAG . Na przykład dane wyjściowe można wygenerować za każdym razem, gdy dwa kolejne samochody z tego samego make przejść przez opłaty za ostatnie 90 sekund.

Dane wejściowe:

Marka License_plate Godzina
Make1 ABC-123 2015-01-01T00:00:01Z
Make1 AAA-999 2015-01-01T00:00:02Z
Make2 DEF-987 2015-01-01T00:00:03Z
Make1 GHI-345 2015-01-01T00:00:04Z

Dane wyjściowe:

Marka Godzina Current_car_license_plate First_car_license_plate First_car_time
Make1 2015-01-01T00:00:02Z AAA-999 ABC-123 2015-01-01T00:00:01Z

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 tę wartość z wartością Make bieżącego zdarzenia. Po spełnieniu warunku dane z poprzedniego zdarzenia można projektować 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 startowe po odebraniu zdarzenia końcowego. To zapytanie może być przydatne do określenia czasu spędzanego przez użytkownika na stronie lub funkcji.

Dane wejściowe:

Użytkownik Cecha Zdarzenie Godzina
user@location.com RightMenu Rozpocznij 2015-01-01T00:00:01Z
user@location.com RightMenu End 2015-01-01T00:00:08Z

Dane wyjściowe:

Użytkownik Cecha Czas trwania
user@location.com RightMenu 7

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 czas wyszukiwania w czasie do 1 godziny między zdarzeniami Koniec i Uruchamianie.

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. Zapytanie można utworzyć, aby obliczyć, ile unikatowych samochodów przechodzi przez kabinę opłat w 2-sekundowym oknie.

Dane wejściowe:

Marka Godzina
Make1 2015-01-01T00:00:01Z
Make1 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:01Z
Make2 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:03Z

Wyjście:

Count_make Godzina
2 2015-01-01T00:00:02Z
1 2015-01-01T00:00:04Z

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

IsFirst może służyć do pobierania pierwszego zdarzenia w przedziale czasu. Na przykład wyprowadzanie pierwszych informacji o samochodzie w odstępie 10 minut.

Dane wejściowe:

License_plate Marka Godzina
DXE 5291 Make1 2015-07-27T00:00:05Z
YZK 5704 Make3 2015-07-27T00:02:17Z
RMV 8282 Make1 2015-07-27T00:05:01Z
YHN 6970 Make2 2015-07-27T00:06:00Z
VFE 1616 Make2 2015-07-27T00:09:31Z
QYF 9358 Make1 2015-07-27T00:12:02Z
MDR 6128 Utwórz 4 2015-07-27T00:13:45Z

Dane wyjściowe:

License_plate Marka Godzina
DXE 5291 Make1 2015-07-27T00:00:05Z
QYF 9358 Make1 2015-07-27T00:12:02Z

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 dla każdego konkretnego samochodu Make znalezionego co 10-minutowy interwał.

Dane wyjściowe:

License_plate Marka Godzina
DXE 5291 Make1 2015-07-27T00:00:05Z
YZK 5704 Make3 2015-07-27T00:02:17Z
YHN 6970 Make2 2015-07-27T00:06:00Z
QYF 9358 Make1 2015-07-27T00:12:02Z
MDR 6128 Utwórz 4 2015-07-27T00:13:45Z

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 średniej dla zdarzeń w danym przedziale czasu, należy filtrować zduplikowane zdarzenia. W poniższym przykładzie drugie zdarzenie jest duplikatem pierwszego.

Dane wejściowe:

DeviceId Godzina Atrybut Wartość
1 2018-07-27T00:00:01Z Temperatura 50
1 2018-07-27T00:00:01Z Temperatura 50
2 2018-07-27T00:00:01Z Temperatura 40
1 2018-07-27T00:00:05Z Temperatura 60
2 2018-07-27T00:00:05Z Temperatura 50
1 2018-07-27T00:00:10Z Temperatura 100

Dane wyjściowe:

AverageValue DeviceId
70 1
45 2

Zapytanie:

With Temp AS (
SELECT
	COUNT(DISTINCT Time) AS CountTime,
	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)

Funkcja COUNT(DISTINCT Time) zwraca liczbę unikatowych wartości w kolumnie Czas w przedziale czasu. Dane wyjściowe pierwszego kroku można następnie użyć do obliczenia średniej na urządzenie przez odrzucenie duplikatów.

Aby uzyskać więcej informacji, zobacz COUNT(DISTINCT Time).

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 "B" do innej marki.

Dane wejściowe:

Marka Godzina
Make1 2015-01-01T00:00:01Z
Make2 2015-01-01T00:00:02Z
Make2 2015-01-01T00:00:03Z

Dane wyjściowe:

Marka Dispatch_to_lane Godzina
Make1 "A" 2015-01-01T00:00:01Z
Make2 "B" 2015-01-01T00:00:02Z

Rozwiązanie 2.

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 wyrażeń prostych w celu określenia jego wyniku. W tym przykładzie pojazdy make1 są wysyłane do pasa "A", podczas gdy pojazdy dowolnego innego urządzenia będą przypisywane pas "B".

Aby uzyskać więcej informacji, zobacz wyrażenie przypadku.

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 użyć w obliczeniu liczbowym.

Dane wejściowe:

Marka Godzina Waga
Make1 2015-01-01T00:00:01Z "1000"
Make1 2015-01-01T00:00:02Z "2000"

Dane wyjściowe:

Marka Waga
Make1 3000

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

Dane wejściowe:

Marka Godzina Waga
Make1 2015-01-01T00:00:01Z 2000
Make2 2015-01-01T00:00:02Z 25 000
Make1 2015-01-01T00:00:03Z 26000
Make2 2015-01-01T00:00:04Z 25 000
Make1 2015-01-01T00:00:05Z 26000
Make2 2015-01-01T00:00:06Z 25 000
Make1 2015-01-01T00:00:07Z 26000
Make2 2015-01-01T00:00:08Z 2000

Dane wyjściowe:

Start_fault End_fault
2015-01-01T00:00:02Z 2015-01-01T00:00:07Z

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ą wraz z bieżącą miarą. Drugi element SELECT powraca do ostatniego zdarzenia, w którym previous_weight jest mniejsza 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, w którym poprzednie zdarzenie było uszkodzone, a Start_fault jest ostatnim zdarzeniem, które nie jest wadliwe.

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 dla TollID 2 wynosi pięć sekund za TollID 1, a zegar urządzenia dla TollID 3 wynosi dziesięć sekund za TollID 1. Obliczenia mogą być wykonywane niezależnie dla każdego opłaty, biorąc pod uwagę tylko własne dane zegara jako znacznik czasu.

Dane wejściowe:

LicensePlate Marka Godzina Identyfikator opłaty płatnej
DXE 5291 Make1 2015-07-27T00:00:01Z 1
YHN 6970 Make2 2015-07-27T00:00:05Z 1
QYF 9358 Make1 2015-07-27T00:00:01Z 2
GXF 9462 Make3 2015-07-27T00:00:04Z 2
VFE 1616 Make2 2015-07-27T00:00:10Z 1
RMV 8282 Make1 2015-07-27T00:00:03Z 3
MDR 6128 Make3 2015-07-27T00:00:11Z 2
YZK 5704 Utwórz 4 2015-07-27T00:00:07Z 3

Dane wyjściowe:

Identyfikator opłaty płatnej Liczba
1 2
2 2
1 1
3 1
2 1
3 1

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 podstreams. Zdarzenie wyjściowe dla każdego identyfikatora TollID jest generowane w miarę ich obliczania, co oznacza, że zdarzenia są uporządkowane w odniesieniu do każdego identyfikatora TollID zamiast zmiany kolejności tak, jakby wszystkie urządzenia znajdowały się na tym samym zegarze.

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

Okna sesji

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 określonym czasie 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ą.

Dane wejściowe:

User_id Godzina Adres URL
0 2017-01-26T00:00:00Z "www.example.com/a.html"
0 2017-01-26T00:00:20Z "www.example.com/b.html"
1 2017-01-26T00:00:55Z "www.example.com/c.html"
0 2017-01-26T00:01:10Z "www.example.com/d.html"
1 2017-01-26T00:01:15Z "www.example.com/e.html"

Dane wyjściowe:

User_id StartTime EndTime Duration_in_seconds
0 2017-01-26T00:00:00Z 2017-01-26T00:01:10Z 70
1 2017-01-26T00:00:55Z 2017-01-26T00:01:15Z 20

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 .

Rozszerzalność języka za pomocą funkcji zdefiniowanej przez użytkownika w językach JavaScript i C #

Język zapytań usługi Azure Stream Analytics można rozszerzyć za pomocą 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 zdefiniowana przez użytkownika może służyć do konwertowania wartości szesnastkowej nvarchar(max) na wartość bigint .

Dane wejściowe:

Device_id Wartość szesnastkowy
1 "B4"
2 "11B"
3 "121"

Dane wyjściowe:

Device_id Liczba dziesiętna
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 User-Defined oblicza wartość bigint z wartości HexValue dla każdego używanego zdarzenia.

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

Zaawansowane dopasowywanie wzorca przy użyciu 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 Godzina
1 "Wprowadzanie pinezki" "Sukces" 2017-01-26T00:10:00Z
2 "Otwarcie gniazda pieniędzy" "Sukces" 2017-01-26T00:10:07Z
2 "Zamknięcie gniazda pieniędzy" "Sukces" 2017-01-26T00:10:11Z
1 "Wprowadzanie ilości wycofania" "Sukces" 2017-01-26T00:10:08Z
1 "Otwarcie gniazda pieniędzy" "Ostrzeżenie" 2017-01-26T00:10:14Z
1 "Drukowanie salda bankowego" "Ostrzeżenie" 2017-01-26T00:10:19Z

Dane wyjściowe:

ATM_id First_Warning_Operation_id Warning_Time
1 "Otwarcie gniazda pieniędzy" 2017-01-26T00:10:14Z
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. PATTERN definiuje wyrażenie regularne, które ma być używane w pasującym przypadku, 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 i 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, która specjalizuje się w maszynach produkcyjnych do drukowania paszportów, wynajmuje swoje maszyny rządom i konsulatom. Lokalizacja tych maszyn jest mocno kontrolowana, aby uniknąć błędnego rozplacingu i możliwego użycia do podrabiania paszportów. Każda maszyna jest wyposażona w tracker GPS, który jest przekazywany 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 może zdalnie wyłączyć, władze alertów i pobrać sprzęt.

Dane wejściowe:

Equipment_id Equipment_current_location Godzina
1 "POINT(-122.1328879797982818 47.64082002051315)" 2017-01-26T00:10:00Z
1 "POINT(-122.13307252987875 47.64081350934929)" 2017-01-26T00:11:00Z
1 "POINT(-122.13308862313283 47.6406508603241)" 2017-01-26T00:12:00Z
1 "POINT(-122.13341048821462 47.64043760861279)" 2017-01-26T00:13:00Z

Dane wejściowe odwołań:

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

Dane wyjściowe:

Equipment_id Equipment_alert_location Godzina
1 "POINT(-122.13341048821462 47.64043760861279)" 2017-01-26T00:13:00Z
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, 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 scenariusze agregacji geoprzestrzennych i geoprzestrzennych za pomocą usługi Azure Stream Analytics .

Uzyskaj pomoc

Aby uzyskać dalszą pomoc, wypróbuj naszą stronę pytań dotyczących języka Microsoft Q&A dotyczącą usługi Azure Stream Analytics.

Następne kroki