الانتقال إلى المحتوى الرئيسي
تتيح لك دوال النافذة إجراء عمليات حسابية عبر مجموعة من الصفوف المرتبطة بالصف الحالي. ويمكن استخدامها لإجراء عمليات حسابية مشابهة لتلك التي تُنفَّذ باستخدام الدوال التجميعية، لكنها تختلف في أن دالة النافذة لا تؤدي إلى تجميع الصفوف في ناتج واحد، بل تظل الصفوف الفردية مُعادة.

دوال النافذة القياسية

يدعم ClickHouse بنية SQL القياسية للنوافذ ودوال النافذة. يوضح الجدول أدناه الميزات المدعومة حاليًا:

الصيغة

  • PARTITION BY - يحدّد كيفية تقسيم مجموعة النتائج إلى مجموعات.
  • ORDER BY - يحدّد كيفية ترتيب الصفوف داخل المجموعة أثناء حساب aggregate_function.
  • ROWS or RANGE - يحدّد حدود الإطار، ويُحسَب aggregate_function ضمن هذا الإطار.
  • WINDOW - يتيح لعدة تعبيرات استخدام تعريف النافذة نفسه.

الدوال التي لا يمكن استخدامها إلا كدوال نافذة

لا يمكن استخدام الدوال التالية إلا كدوال نافذة. معظمها دوال SQL قياسية، بينما تُعد lagInFrame وleadInFrame وnonNegativeDerivative امتدادات خاصة بـ ClickHouse.

أمثلة

لنلقِ نظرة على بعض الأمثلة لكيفية استخدام دوال النافذة.

ترقيم الصفوف

دوال التجميع

قارن راتب كل لاعب بمتوسط راتب فريقه.
قارن راتب كل لاعب بأقصى راتب في فريقه.

التقسيم حسب العمود

تعيين حدود الإطار

أمثلة واقعية

تتناول الأمثلة التالية مشكلات واقعية شائعة.

الحد الأقصى/إجمالي الرواتب لكل قسم

المجموع التراكمي

المتوسط المتحرك / المتوسط الانزلاقي (لكل 3 صفوف)

المتوسط المتحرك / المتوسط الانزلاقي (كل 10 ثوانٍ)

المتوسط المتحرك / المتوسط الانزلاقي (لكل 10 أيام)

تُخزَّن درجة الحرارة بدقة الثانية، ولكن باستخدام Range و ORDER BY toDate(ts) نُكوِّن إطارًا بحجم 10 وحدات، وبما أن toDate(ts) مستخدَمة هنا، فالوحدة هي اليوم.

المراجع

مشكلات GitHub

خطة الطريق للدعم الأولي لدوال النوافذ موجودة في هذه المشكلة. جميع مشكلات GitHub المتعلقة بدوال النوافذ تحمل الوسم comp-window-functions.

الاختبارات

تتضمن هذه الاختبارات أمثلة على البنية النحوية المدعومة حاليًا: https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql

وثائق Postgres

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

وثائق MySQL

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
آخر تعديل في ٢ يوليو ٢٠٢٦