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

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

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

الصيغة

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

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

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

أمثلة

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

ترقيم الصفوف

دوال التجميع

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

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

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

إطار GROUPS

يحسب إطار GROUPS مجموعات الأقران كاملةً — وهي مجموعات من الصفوف المتساوية في مفتاح ORDER BY — بدلًا من الصفوف الفعلية (ROWS) أو قيم ORDER BY (RANGE). يحسب N PRECEDING وN FOLLOWING عدد N من مجموعات الأقران قبل مجموعة أقران الصف الحالي وبعدها، وتُحتسب جميع صفوف أي مجموعة أقران مُضمَّنة دائمًا. يطبّق الاستعلام أدناه الحدود نفسها، 1 PRECEDING AND 1 FOLLOWING، كما في إطارات ROWS وRANGE وGROUPS. يحتوي العمود order على قيم مكررة وغير متتالية، لذا تشمل الأوضاع الثلاثة صفوفًا مختلفة:
يفسّر كل وضع الحدود بصورة مختلفة:
  • يحسب ROWS الصفوف الفعلية، لذا يقتصر الإطار على ثلاثة صفوف متجاورة كحد أقصى: الصف الحالي وصف واحد على كل جانب.
  • يحسب RANGE قيم order، لذا يشمل 1 PRECEDING و1 FOLLOWING الصفوف التي تقع قيمة order فيها ضمن مسافة 1 من قيمة الصف الحالي. وعند وجود فجوات بمقدار 10، لا يستوفي أي صف مجاور الشرط، لذلك لا يضم الإطار إلا الصفوف التي تشترك في قيمة order للصف الحالي.
  • يحسب GROUPS مجموعات النظائر، لذا يشمل 1 PRECEDING و1 FOLLOWING دائمًا المجموعات المتجاورة كاملةً، بغض النظر عن الفجوات بين قيم order.

أمثلة واقعية

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

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

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

المتوسط المتحرك / المتوسط الانزلاقي (لكل 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
آخر تعديل في ١٤ أغسطس ٢٠٢٦