Azure 串流分析中的常見查詢模式

Azure 串流分析的查詢會以類似 SQL 的查詢語言表示。 語言建構記載於 串流分析查詢語言參考 指南中。

查詢設計可以表達簡單的傳遞邏輯,將事件數據從一個輸入數據流移至輸出數據存放區,也可以執行豐富的模式比對和時態分析,以計算各種時間範圍匯總,如同使用串流分析指南建置 IoT 解決方案一樣。 您可以從多個輸入聯結數據來合併串流事件,而且您可以針對靜態參考數據執行查閱,以擴充事件值。 您也可以將資料寫入多個輸出。

本文概述根據真實世界案例的數個常見查詢模式解決方案。

支援的數據格式

Azure 串流分析支援以 CSV、JSON 和 Avro 資料格式處理事件。 JSON 和 Avro 格式可以包含複雜的類型,例如巢狀物件(記錄)或陣列。 如需使用這些複雜數據類型的詳細資訊,請參閱 剖析 JSON 和 AVRO 數據

將數據傳送至多個輸出

多個 SELECT 語句可用來將資料輸出到不同的輸出接收。 例如,一個 SELECT 語句可以輸出閾值型警示,而另一個語句則可將事件輸出至 Blob 記憶體。

請考慮下列 輸入

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

而且,您想要查詢的下列兩個輸出:

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 |

使用封存輸出和警示輸出作為輸出的 SELECT 語句進行查詢:

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 子句會告訴串流分析服務要寫入數據的輸出。 第一 個 SELECT 會定義傳遞查詢,從輸入接收數據,並將其傳送至名為 ArchiveOutput 的輸出。 第二個查詢會先匯總並篩選數據,再將結果傳送至名為 AlertOutput 的下游警示系統輸出。

WITH 子句可用來定義多個子查詢區塊。 此選項的優點是開啟輸入來源的讀取器較少。

查詢:

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

如需詳細資訊,請參閱 WITH 子句

簡單的傳遞查詢

簡單的傳遞查詢可用來將輸入數據流數據複製到輸出中。 例如,如果包含即時車輛信息的數據流必須儲存在 SQL 資料庫中以供稍後分析,則簡單的傳遞查詢會執行此作業。

請考慮下列 輸入

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

您希望 輸出 與輸入相同:

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

以下是 查詢

SELECT
	*
INTO Output
FROM Input

SELECT * 查詢會投影 傳入事件的所有 欄位,並將其傳送至輸出。 相反地,您只能投影 SELECT 語句中的必要欄位。 在下列範例中 ,SELECT 語句只會 投影輸入數據的MakeTime 欄位。

請考慮下列 輸入

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

您希望輸出只有 [製作] 和 [時間] 字段:

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

以下是 僅投影必要欄位的查詢

SELECT
	Make, Time
INTO Output
FROM Input

與 LIKE 和 NOT LIKE 相符的字串

LIKENOT LIKE 可用來驗證欄位是否符合特定模式。 例如,您可以使用篩選來只傳回以字母 A 開頭的車牌,並以數位 9結尾。

請考慮下列 輸入

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

您希望 輸出 具有開頭為字母 A 的車牌,並以數字 9結尾:

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

以下是 使用 LIKE 運算子的查詢

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

使用 LIKE 語句來檢查License_plate域值。 它應該以字母 A開頭,然後具有零個或多個字元的任何字串,結尾為數位9。

過去事件的計算

LAG 函式可用來查看時間範圍內過去的事件,並將其與目前事件進行比較。 例如,如果與通過收費站的最後一輛車不同,則可以輸出目前汽車的製造。

範例 輸入

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

範例 輸出

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

範例 查詢

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

使用 LAG 來查看輸入數據流一個事件,擷取 Make 值並將其與目前事件的 Make 值進行比較,並輸出事件。

如需詳細資訊,請參閱LAG

傳回視窗中的最後一個事件

由於系統會即時取用事件,因此沒有函式可以判斷事件是否為該時間範圍最後到達的事件。 若要達成此目的,輸入數據流必須與另一個數據流聯結,其中事件的時間是該時間範圍中所有事件的最大時間。

範例 輸入

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

範例 輸出 ,其中包含兩個十分鐘時間範圍中最後一輛車的相關信息:

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

範例 查詢

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

查詢的第一個步驟會在 10 分鐘的視窗中尋找時間戳上限,也就是該視窗最後一個事件的時間戳。 第二個步驟會將第一個查詢的結果與原始數據流聯結,以尋找符合每個視窗中最後一個時間戳的事件。

DATEDIFF 是日期特定函式,可比較並傳回兩個 DateTime 欄位之間的時間差異,如需詳細資訊,請參閱 日期函式

如需聯結數據流的詳細資訊,請參閱 JOIN

一段時間的數據匯總

若要計算時間範圍中的資訊,您可以匯總數據。 在此範例中,語句會計算過去 10 秒內每一個特定汽車的計數。

範例 輸入

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

範例 輸出

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

查詢:

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

此匯總會依 Make 將汽車分組,並每隔10秒計算一次。 輸出具有 通過收費站的汽車製造計數

TumblingWindow 是用來將事件分組在一起的視窗化函式。 匯總可以套用到所有群組事件。 如需詳細資訊,請參閱 視窗化函式

如需匯總的詳細資訊,請參閱 聚合函數

定期輸出值

當事件遺失或不規則時,可以從較疏鬆的數據輸入產生一般間隔輸出。 例如,每隔 5 秒產生一個事件,報告最近看到的數據點。

範例 輸入

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

範例 輸出 (前 10 個資料列)

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

範例 查詢

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)

此查詢會每隔 5 秒產生事件一次,並輸出先前收到的最後一個事件。 HOPPINGWINDOW 持續時間會決定查詢尋找最新事件的時間長度。

如需詳細資訊,請參閱 跳躍視窗

將數據流中的事件相互關聯

藉由使用 LAG 函式查看過去的事件,即可在相同數據流中關聯事件。 例如,每次來自相同 Make 的兩輛連續汽車在過去 90 秒內通過收費站時,就會產生輸出。

範例 輸入

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

範例 輸出

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

範例 查詢

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式可以回頭查看輸入數據流,並擷取Make值,並將該值與目前事件的Make值進行比較。 一旦符合條件,就可以在 SELECT 語句中使用 LAG 來投影上一個事件中的數據。

如需詳細資訊,請參閱 LAG

偵測事件之間的持續時間

一旦收到 End 事件,就可以查看最後一個 Start 事件來計算事件的持續時間。 此查詢對於判斷使用者花費在頁面上或功能的時間很有用。

範例 輸入

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

範例 輸出

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

範例 查詢

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 函式可用來擷取特定條件內的最後一個事件。 在此範例中,條件是 Start 類型的事件,依 PARTITION BY 使用者和功能分割搜尋。 如此一來,在搜尋 Start 事件時,每個使用者和功能都會獨立處理。 LIMIT DURATION 會將搜尋時間限製為 End 和 Start 事件之間的 1 小時。

計算唯一值

COUNTDISTINCT 可用來計算時間範圍內出現在數據流中的唯一域值數目。 您可以建立查詢,以計算 2 秒視窗中有多少輛唯 一的 汽車通過收費站。

範例 輸入

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

範例 輸出:

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

範例 查詢:

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

COUNT(DISTINCT Make) 會傳回時間範圍內Make資料行中相異值的計數。 如需詳細資訊,請參閱 COUNT 聚合函數

擷取視窗中的第一個事件

您可以使用 IsFirst 來擷取時間範圍中的第一個事件。 例如,每隔 10 分鐘一次輸出第一個汽車資訊。

範例 輸入

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

範例 輸出

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

範例 查詢

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

IsFirst 也可以分割數據,並將第一個事件計算至每 10 分鐘間隔找到的每個特定汽車 Make

範例 輸出

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

範例 查詢

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

如需詳細資訊,請參閱IsFirst

拿掉視窗中的重複事件

當您執行作業,例如計算指定時間範圍中事件的平均值時,應該篩選重複的事件。 在下列範例中,第二個事件是第一個事件的重複專案。

範例 輸入

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

範例 輸出

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

範例 查詢

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)

當第一個語句執行時,重複的記錄會合併成一個,因為 group by 子句中的欄位都相同。 因此,它會移除重複專案。

指定不同案例/值的邏輯(CASE 語句)

CASE 語句可以根據特定準則,為不同的欄位提供不同的計算。 例如,將車道 A 指派給 Make1 和 車道 B 給任何其他製造。

範例 輸入

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

範例 輸出

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

範例 查詢

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 表達式會將表達式與一組簡單的運算式進行比較,以判斷其結果。 在此範例中,的 Make1 車輛會分派至車道 A ,而任何其他製造車輛的車輛將指派車道 B

如需詳細資訊,請參閱 案例表達式

資料轉換

您可以使用 CAST 方法即時轉換資料。 例如,汽車重量可以從 nvarchar(max) 類型轉換成 bigint 類型,並用於數值計算。

範例 輸入

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

範例 輸出

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

範例 查詢

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

使用 CAST 語句來指定其資料類型。 請參閱資料類型 (Azure 串流分析)支援的數據類型清單。

如需數據轉換函式的詳細資訊

偵測條件的持續時間

對於跨越多個事件的條件, LAG 函式可用來識別該條件的持續時間。 例如,假設錯誤導致所有汽車的重量不正確(超過 20,000 磅),而且必須計算該 Bug 的持續時間。

範例 輸入

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

範例 輸出

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

範例 查詢

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

第一個 SELECT 語句會將目前的權數測量與先前的度量相互關聯,並投影到目前的度量。 第二個 SELECT 會回顧previous_weight小於 20000 的最後一個事件,其中目前的權數小於 20000,而目前事件的previous_weight大於 20000。

End_fault是先前事件發生錯誤的目前非預設事件,而Start_fault是該事件之前的最後一個非預設事件。

使用獨立時間處理事件 (子資料流)

由於事件產生者之間的時鐘扭曲、分割區之間的時鐘扭曲或網路等待時間,事件可能會延遲或順序失序。 例如,TollID 2 的裝置時鐘比 TollID 1 落後 5 秒,而 TollID 3 的裝置時鐘比 TollID 1 落後 10 秒。 計算可能會針對每個收費項目獨立進行,但只會將自己的時鐘數據視為時間戳。

範例 輸入

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

範例 輸出

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

範例 查詢

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

TIMESTAMP OVER BY 子句會使用子流獨立查看每個裝置時間軸。 系統會在計算每個 TollID 時產生每個 TollID 的輸出事件,這表示事件會依每個 TollID 的順序排列,而不是重新排序,就像所有裝置都在相同的時鐘上一樣。

如需詳細資訊,請參閱 TIMESTAMP BY OVER

工作階段視窗

工作階段視窗是一個視窗,會在事件發生時持續展開,如果在特定時間量之後未收到任何事件,或窗口達到最大持續時間,則會關閉計算。 這個視窗在計算使用者互動數據時特別有用。 當使用者開始與系統互動時,視窗就會開始,當沒有觀察到更多事件時關閉,這表示使用者已停止互動。 例如,使用者正在與記錄點擊次數的網頁互動,會話視窗可用來找出使用者與網站互動的時間長度。

範例 輸入

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

範例 輸出

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

範例 查詢

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 會投影與使用者互動相關的數據,以及互動的持續時間。 依使用者和 SessionWindow 分組數據,會在 1 分鐘內不發生任何互動時關閉,視窗大小上限為 60 分鐘。

如需 SessionWindow 的詳細資訊,請參閱 工作階段視窗

JavaScript 和 C 中的使用者定義函式#

您可以使用以 JavaScript 或 C# 語言撰寫的自定義函式來擴充 Azure 串流分析查詢語言。 使用者定義函數 (UDF) 是無法使用 SQL 語言輕鬆表示的自訂/複雜計算。 這些 UDF 可以定義一次,並在查詢內多次使用。 例如,UDF 可用來將十六進位 nvarchar(max)轉換成 bigint 值。

範例 輸入

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

範例 輸出

| 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

用戶定義函式會針對 取用的每個事件計算 HexValue 中的 bigint 值。

如需詳細資訊,請參閱 JavaScriptC#

使用 MATCH_RECOGNIZE 進行進階模式比對

MATCH_RECOGNIZE是一種進階模式比對機制,可用來比對事件序列與定義完善的正則表達式模式。 例如,在 ATM 作業期間,如果系統管理員需要通知兩個連續警告訊息,則 ATM 會即時監視失敗。

輸入:

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

輸出:

| 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

此查詢會比對至少兩個連續的失敗事件,並在符合條件時產生警示。 PATTERN 定義要在比對上使用的正則表示式,在此案例中,至少有兩個連續警告在至少一個成功的作業之後使用。 成功和警告是使用 Return_Code 值來定義,而且一旦符合條件, 就會預測 MEASUREATM_id、第一個警告作業和第一次警告時間。

如需詳細資訊,請參閱 MATCH_RECOGNIZE

地理柵欄和地理空間查詢

Azure 串流分析提供內建地理空間功能,可用來實作車隊管理、乘坐共用、聯機汽車和資產追蹤等案例。 地理空間數據可以擷取 GeoJSON 或 WKT 格式作為事件數據流或參考數據的一部分。 例如,一家專門從事列印護照製造機器的公司,將其機器租用給政府和領事館。 這些機器的位置受到嚴格控制,以避免錯誤和可能用於偽造護照。 每部機器都安裝了 GPS 追蹤器,該資訊會轉送回 Azure 串流分析作業。 製造商希望追蹤這些機器的位置,並在其中一部機器離開授權區域時收到警示,這樣他們就可以從遠端停用、警示當局並取出設備。

輸入:

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

參考資料輸入

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

輸出:

| 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

此查詢可讓製造商自動監視機器位置,在機器離開允許的地理柵欄時收到警示。 內建地理空間功能可讓用戶在沒有第三方連結庫的情況下,在查詢中使用 GPS 數據。

如需詳細資訊,請參閱 使用 Azure 串流分析的地理柵欄和地理空間匯總案例 一文。

取得說明

如需進一步的協助,請嘗試 Azure 串流分析Microsoft Q&A 問題頁面。

下一步