البرمجة

استعلام SQL للعثور على أقصى قيمة في فترة 60 ثانية

للحصول على أقصى قيمة في فترة 60 ثانية لكل سجل، يمكننا استخدام استعلام SQL يقوم بتجميع البيانات بواسطة نافذة زمنية متحركة ومن ثم اختيار القيمة القصوى. في هذه الحالة، يمكن استخدام الدالة الزمنية LAG للوصول إلى الصفوف السابقة، وذلك لحساب فاصل الزمن بين الصفوف.

قبل كتابة الاستعلام، يجب أولاً تحديد كيفية ترتيب البيانات. في هذه الحالة، يتم ترتيب الصفوف حسب العمود hist_timestamp.

والآن، يمكننا كتابة الاستعلام:

sql
WITH lagged_data AS ( SELECT id, hist_timestamp, DP, mints, Secnds, value, LAG(hist_timestamp) OVER (PARTITION BY id ORDER BY hist_timestamp) AS lagged_time FROM your_table_name ) SELECT id, hist_timestamp, DP, mints, Secnds, value FROM ( SELECT id, hist_timestamp, DP, mints, Secnds, value, CASE WHEN (hist_timestamp - lagged_time) <= INTERVAL '60' SECOND THEN 0 ELSE 1 END AS group_indicator, ROW_NUMBER() OVER (PARTITION BY id, (hist_timestamp - lagged_time <= INTERVAL '60' SECOND) ORDER BY value DESC) AS row_num FROM lagged_data ) grouped_data WHERE group_indicator = 1 AND row_num = 1;

هذا الاستعلام يقوم بتحديد الصفوف التي تكون بداخل نافذة زمنية مدتها 60 ثانية لكل سجل، ثم يقوم بتحديد الصف الذي يحتوي على القيمة القصوى في كل فترة زمنية. يتم ذلك عن طريق استخدام CTE لإنشاء عمود يحتوي على الوقت السابق لكل صف، ثم يتم تحديد الفترات الزمنية باستخدام الفرق بين الوقت الحالي والوقت السابق. تستخدم الدالة ROW_NUMBER() لترقيم الصفوف داخل كل فترة زمنية، ثم يتم اختيار الصف الذي يحتوي على القيمة القصوى.

المزيد من المعلومات

بالطبع، ها هو المقال المكتمل:


استعلام SQL للعثور على أقصى قيمة في فترة 60 ثانية

في بعض الحالات، قد نحتاج في قواعد البيانات إلى البحث عن أقصى قيمة ضمن فترة زمنية محددة، وهذا ما يعد تحديًا في كثير من الأحيان. في هذا المقال، سنستكشف كيفية كتابة استعلام SQL للعثور على أقصى قيمة في فترة 60 ثانية لكل سجل.

البيانات الأولية

لنفترض أن لدينا جدولًا يحتوي على بيانات مثل التالي:

id hist_timestamp DP mints Secnds value
99 2016-08-01 00:09:40 1 9 40 193.214
99 2016-08-01 00:10:20 1 10 20 198.573
99 2016-08-01 00:12:00 1 12 0 194.432
99 2016-08-01 00:52:10 1 52 10 430.455
99 2016-08-01 00:55:50 1 55 50 400.739

كتابة الاستعلام

قبل كتابة الاستعلام، يجب أن نحدد كيفية ترتيب البيانات. في هذه الحالة، سنقوم بترتيب الصفوف حسب العمود hist_timestamp.

sql
WITH lagged_data AS ( SELECT id, hist_timestamp, DP, mints, Secnds, value, LAG(hist_timestamp) OVER (PARTITION BY id ORDER BY hist_timestamp) AS lagged_time FROM your_table_name ) SELECT id, hist_timestamp, DP, mints, Secnds, value FROM ( SELECT id, hist_timestamp, DP, mints, Secnds, value, CASE WHEN (hist_timestamp - lagged_time) <= INTERVAL '60' SECOND THEN 0 ELSE 1 END AS group_indicator, ROW_NUMBER() OVER (PARTITION BY id, (hist_timestamp - lagged_time <= INTERVAL '60' SECOND) ORDER BY value DESC) AS row_num FROM lagged_data ) grouped_data WHERE group_indicator = 1 AND row_num = 1;

تفسير الاستعلام

يقوم الاستعلام بتحديد الصفوف التي تقع داخل نافذة زمنية مدتها 60 ثانية لكل سجل. ثم يقوم بتحديد الصف الذي يحتوي على القيمة القصوى في كل فترة زمنية. يتم ذلك عن طريق استخدام Common Table Expression (CTE) لإنشاء عمود يحتوي على الوقت السابق لكل صف، ثم يتم تحديد الفترات الزمنية باستخدام الفرق بين الوقت الحالي والوقت السابق. تستخدم الدالة ROW_NUMBER() لترقيم الصفوف داخل كل فترة زمنية، ثم يتم اختيار الصف الذي يحتوي على القيمة القصوى.

الاستنتاج

من خلال هذا المقال، تعلمنا كيفية كتابة استعلام SQL للعثور على أقصى قيمة في فترة 60 ثانية لكل سجل. استخدام النوافذ الزمنية في SQL يمكن أن يكون أداة قوية لتحليل البيانات الزمنية بكفاءة.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!