Skip to main content

المقدمة

لا يتضمن ClickHouse عامل pivot، لكن يمكننا تحقيق سلوك مماثل باستخدام مُعدِّلات الدوال التجميعية، وتحديدًا تلك التي تحمل اللاحقة -Map. في هذه المقالة، سنتعلّم كيفية القيام بذلك. يوجد أيضًا فيديو يشرح المحتوى نفسه، ويمكنك مشاهدته أدناه:

فهم مُعدِّلات الدوال التجميعية

لنبدأ بمثال بسيط. سنستخدم clickhouse-local، ويمكنك تشغيله بتنفيذ ما يلي:
يستدعي الاستعلام التالي الدالة sumMap، التي تستقبل map وتجمع قيم كل مفتاح:
هذا ليس مثالًا مثيرًا للاهتمام كثيرًا، لأنه يعيد قيمة Map نفسها التي مررناها. لنستدعِ الآن sumMap على عدة صفوف من قيم Map؛
ظهر المفتاح ClickHouse في كلا الصفّين، وجُمعت قيمه. أما المفتاح ClickBench فلم يظهر إلا في أحد الصفّين، لذا تُجمع قيمة واحدة فقط، فتكون النتيجة هي تلك القيمة نفسها! يمكننا أيضًا استخدام maxMap للعثور على القيم العظمى لكل مفتاح:
أو يمكننا استخدام avgMap لحساب متوسط القيمة لكل مفتاح:
نأمل أن يكون هذا قد أعطاك فكرة عن كيفية عمل مُعدِّلات الدوال التجميعية.

تطبيق عملي واقعي: مجموعة بيانات أسعار المساكن في المملكة المتحدة

سنستخدم ما سبق الآن على مجموعة بيانات أكبر في ClickHouse SQL playground. يمكننا الاتصال بـ ClickHouse SQL playground باستخدام clickhouse-client:
سنُجري استعلامًا على الجدول uk_price_paid، لذا فلنستعرض البيانات في هذا الجدول:
يمكننا أن نرى أعلاه أن الجدول يضم حقولًا متنوعة تتعلق بمبيعات العقارات في المملكة المتحدة.

التجميع والتلخيص حسب العقد الزمني

لنحسب وسيط الأسعار بحسب المقاطعة لكل عقد زمني في مجموعة البيانات:

تصفية النتائج

يمكننا تصفية النتائج بحيث تشمل فقط البيانات من عام 2010 فصاعدًا:

دمج عدة عمليات تجميع

وإذا أردنا العثور على أعلى سعر لكل عقد زمني، يمكننا فعل ذلك باستخدام الدالة maxMap التي رأيناها سابقًا:

تطبيق الدوال على قيم map

بدلًا من ذلك، يمكننا حساب متوسط السعر باستخدام avgMap. تحتوي هذه القيم على الكثير من الأرقام بعد الفاصلة العشرية، ويمكننا تبسيطها باستخدام الدالة mapApply لاستدعاء الدالة floor على كل قيمة في map:

تجميع مرن: المقاطعات والمناطق والرموز البريدية

لنجرّب التجميع حسب بعض الحقول المختلفة. هذه المرة سنحسب السعر الوسيط لكل عقد زمني مع التجميع حسب المقاطعة والمنطقة:
يمكننا أيضًا اختيار التجميع حسب السنة ثم دمج postcode1 وpostcode2 في الـ map:
آخر تعديل في ١٤ أغسطس ٢٠٢٦