الانتقال إلى المحتوى الرئيسي

مقدمة

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

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

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

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

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

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

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

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

يمكننا تصفية النتائج بحيث لا تشمل سوى البيانات اعتبارًا من عام 2010:

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

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

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

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

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

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