أنماط الاستعلام الشائعة في Azure Stream Analytics

يتم التعبير عن الاستعلامات في Azure Stream Analytics بلغة استعلام تشبه SQL. يتم توثيق بنيات اللغة في الدليل المرجعي للغة استعلام Stream Analytics.

يمكن أن يُعبّر تصميم الاستعلام عن منطق تمرير بسيط لنقل بيانات الحدث من تدفق إدخال واحد إلى مخزن بيانات الإخراج، أو يمكنه إجراء مطابقة الأنماط الغنية والتحليل الزمني لحساب التجميعات عبر نوافذ زمنية مختلفة كما هو الحال في إنشاء حل IoT باستخدام دليل Stream Analytics. يمكنك ضم البيانات من مدخلات متعددة لدمج أحداث الدفق، ويمكنك إجراء عمليات بحث مقابل البيانات المرجعية الثابتة لإثراء قيم الحدث. يمكنك أيضاً كتابة البيانات إلى إخراجات متعددة.

توضح هذه المقالة حلولاً للعديد من أنماط الاستعلام الشائعة استناداً إلى سيناريوهات واقعية.

تنسيقات البيانات المدعومة

يدعم Azure Stream Analytics معالجة الأحداث بتنسيقات بيانات CSV وJSON وAvro. يمكن أن يحتوي تنسيقا JSON وAvro على أنواع معقدة مثل الكائنات المتداخلة (السجلات) أو الصفائف. لمزيد من المعلومات حول العمل مع أنواع البيانات المعقدة هذه، راجع تحليل بيانات JSON وAVRO.

إرسال البيانات إلى إخراجات متعددة

يمكن استخدام عبارات SELECT المتعددة لإخراج البيانات إلى متلقيات إخراج مختلفة. على سبيل المثال، يمكن لإحدى العبارات SELECT إخراج تنبيه يستند إلى الحد بينما يمكن لبيان آخر إخراج الأحداث إلى تخزين كائن ثنائي كبير الحجم.

خذ بعين الاعتبار الإدخال التالي:

| 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 خدمة Stream Analytics أي من المخرجات لكتابة البيانات إليها. يحدد 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 باسقاط حقلي Make و Time فقط من بيانات الإدخال.

خذ بعين الاعتبار الإدخال التالي:

| 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 فقط:

| 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

سلسلة مطابقة مع المركبة وNOT LIKE

يمكن استخدام LIKE وNOT 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)

يجمع هذا التجميع السيارات حسب الطراز ويحسبها كل 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. على سبيل المثال، يمكن إنشاء إخراج في كل مرة اثنين من السيارات المتتالية من نفس جعل الذهاب من خلال كشك المكالمات في آخر 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 للحدث الحالي. بمجرد استيفاء الشرط، يمكن عرض البيانات من الحدث السابق باستخدام LAG في عبارة SELECT.

لمزيدٍ من المعلومات، راجع LAG.

الكشف عن المدة بين الأحداث

يمكن حساب مدة الحدث من خلال النظر إلى حدث Start الأخير بمجرد تلقي حدث End. يمكن أن يكون هذا الاستعلام مفيداً لتحديد الوقت الذي يقضيه المستخدم في صفحة أو ميزة.

نموذج الإدخال:

| 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. بهذه الطريقة، يتم التعامل مع كل مستخدم وميزة بشكل مستقل عند البحث عن حدث البدء. يحد LIMIT DURATION من وقت البحث مرة أخرى إلى ساعة واحدة بين الحدثين End وStart.

حساب القيم الفريدة

يمكن استخدام COUNT وDISTINCT لحساب عدد قيم الحقول الفريدة التي تظهر في الدفق ضمن إطار زمني. يمكنك إنشاء استعلام لحساب عدد السيارات الفريدة التي مرت عبر كشك المكالمات في نافذة 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 دقائق.

إخراج العينة:

| 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 لسيارات و حارة Make1B إلى أي صنع آخر.

نموذج الإدخال:

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

لمزيد من المعلومات، راجع تعبير case.

تحويل البيانات

يمكن تحويل البيانات في الوقت الفعلي باستخدام أسلوب 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 Stream Analytics).

لمزيد من المعلومات بشأن دالات تحويل البيانات.

الكشف عن مدة الشرط

بالنسبة للشروط التي تمتد عبر أحداث متعددة، يمكن استخدام الدالة LAG لتحديد مدة هذا الشرط. على سبيل المثال، لنفترض أن خطأً نتج عنه وزن غير صحيح لجميع السيارات (أعلى من 20,000 رطل)، ويجب حساب مدة هذا الخطأ.

نموذج الإدخال:

| 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 هي خمس ثوان خلف الرقم 1، وساعة الجهاز ل TollID 3 هي 10 ثوان خلف معرف المكالمات 1. يمكن أن يحدث الحساب بشكل مستقل لكل رسوم مرور، مع اعتبار بيانات الساعة الخاصة بها فقط كطوابع زمنية.

نموذج الإدخال:

| 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 بدلاً من إعادة ترتيبها كما لو كانت جميع الأجهزة على نفس الساعة.

لمزيد من المعلومات، راجع 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 التي تُغلق إذا لم يحدث أي تفاعل في غضون دقيقة واحدة، بحد أقصى لحجم النافذة يبلغ 60 دقيقة.

لمزيد من المعلومات بشأن SessionWindow، راجع نافذة الجلسة.

الدالات المعرفة من قبل المستخدم في JavaScript وC#

يمكن توسيع لغة استعلام Azure Stream Analytics باستخدام دالات مخصصة مكتوبة إما بلغة JavaScript أو لغة C#. الدالات المعرّفة من قِبل المستخدم (UDF) هي حسابات مخصصة/معقدة لا يمكن التعبير عنها بسهولة باستخدام لغة SQL. يمكن تعريف الدالات المعرّفة من قِبل المستخدم (UDFs) هذه مرة واحدة واستخدامها عدة مرات داخل الاستعلام. على سبيل المثال، يمكن استخدام UDF لتحويل قيمة nvarchar(max) سداسية عشرية إلى قيمة عدد صحيح كبير.

نموذج الإدخال:

| 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

تحسب الدالة المعرفة من قبل المستخدم قيمة bigint من HexValue على كل حدث يتم استهلاكه.

للمزيد من المعلومات، راجع JavaScript وC#‎.

مطابقة النمط المتقدمة باستخدام 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 وبمجرد استيفاء الشرط، يتم عرض MEASURES مع ATM_id، عملية التحذير الأولى ووقت التحذير الأول.

لمزيد من المعلومات، راجع MATCH_RECOGNIZE.

استعلامات السياج الجغرافي والموضع الجيوفضائي

يوفر Azure Stream Analytics وظائف الموضع الجيوفضائي المدمجة والتي يمكن استخدامها لتنفيذ سيناريوهات مثل إدارة الأسطول ومشاركة الركوب والسيارات المتصلة وتعقب الأصول. يمكن استيعاب بيانات الموضع الجيوفضائي بتنسيقات GeoJSON أو WKT كجزء من دفق الحدث أو البيانات المرجعية. على سبيل المثال، شركة متخصصة في تصنيع آلات لطباعة جوازات السفر، وتؤجر أجهزتها للحكومات والقنصليات. يتم التحكم بشدة في موقع تلك الأجهزة لتجنب سوء الاستخدام المحتمل لتزوير جوازات السفر. يتم تزويد كل جهاز بمتتبع GPS، ويتم ترحيل هذه المعلومات مرة أخرى إلى مهمة Azure Stream Analytics. ترغب الشركة المصنعة في تتبع موقع تلك الآلات وتنبيهها إذا غادرت إحداها منطقة معتمدة، وبهذه الطريقة يمكنها تعطيلها عن بُعد، وتنبيه السلطات واسترداد المعدات.

الإدخال:

| 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 Stream Analytics.

الحصول على المساعدة

لمزيد من المساعدة، جرب صفحة سؤال Microsoft Q&A الخاصة بنا ل Azure Stream Analytics.

الخطوات التالية