-If
يمكن إلحاق اللاحقة -If باسم أي دالة تجميعية. في هذه الحالة، تقبل الدالة التجميعية وسيطة إضافية — شرطًا (من النوع Uint8). ولا تعالج الدالة التجميعية إلا الصفوف التي تحقق الشرط. وإذا لم يتحقق الشرط ولو مرة واحدة، فإنها تُرجع قيمة افتراضية (عادةً أصفارًا أو سلاسل نصية فارغة). أمثلة:sumIf(column, cond), countIf(cond), avgIf(x, cond), quantilesTimingIf(level1, level2)(x, cond), argMinIf(arg, val, cond) وما إلى ذلك.
باستخدام الدوال التجميعية الشرطية، يمكنك حساب القيم المجمعة لعدة شروط في الوقت نفسه، من دون استخدام الاستعلامات الفرعية وعمليات JOIN. على سبيل المثال، يمكن استخدام الدوال التجميعية الشرطية لتنفيذ ميزة مقارنة الشرائح.
-Array
يمكن إلحاق اللاحقة -Array بأي دالة تجميع. في هذه الحالة، تأخذ دالة التجميع وسيطات من النوع ‘Array(T)’ (مصفوفات) بدلًا من وسيطات من النوع ‘T’. وإذا كانت دالة التجميع تقبل عدة وسيطات، فيجب أن تكون هذه الوسيطات مصفوفات ذات أطوال متساوية. وعند معالجة المصفوفات، تعمل دالة التجميع بالطريقة نفسها التي تعمل بها دالة التجميع الأصلية على جميع عناصر المصفوفة. مثال 1:sumArray(arr) - يجمع إجمالي جميع عناصر كل مصفوفات ‘arr’. في هذا المثال، كان يمكن كتابة ذلك بصورة أبسط: sum(arraySum(arr)).
مثال 2: uniqArray(arr) – يحسب عدد العناصر الفريدة في جميع مصفوفات ‘arr’. ويمكن تنفيذ ذلك بطريقة أسهل: uniq(arrayJoin(arr))، لكن لا يكون من الممكن دائمًا إضافة ‘arrayJoin’ إلى استعلام.
يمكن الجمع بين -If و -Array. ومع ذلك، يجب أن تأتي ‘Array’ أولًا ثم ‘If’. أمثلة: uniqArrayIf(arr, cond), quantilesTimingArrayIf(level1, level2)(arr, cond). وبسبب هذا الترتيب، لن تكون الوسيطة ‘cond’ مصفوفة.
-Map
يمكن إلحاق اللاحقة-Map بأي aggregate function. ويؤدي ذلك إلى إنشاء aggregate function تستقبل Map type كـ argument، وتُجمِّع values الخاصة بكل key في الـ map كلًّا على حدة باستخدام aggregate function المحددة. وتكون النتيجة أيضًا من Map type.
مثال
-SimpleState
إذا طبّقت هذا الـ combinator، فستُرجِع aggregate function القيمة نفسها ولكن بنوع مختلف. ويكون هذا SimpleAggregateFunction(…) قابلاً للتخزين في table للعمل مع جداول AggregatingMergeTree. الصياغةx— معلمات الدالة التجميعية.
SimpleAggregateFunction(...).
مثال
Query
Response
-State
إذا طبّقت هذا combinator، فلن تُرجِع الدالة التجميعية القيمةَ الناتجة (مثل عدد القيم الفريدة للدالة uniq)، بل تُرجِع حالةً وسيطة من عملية التجميع (وبالنسبة إلىuniq، فهذه هي hash table المستخدمة لحساب عدد القيم الفريدة). وهذا AggregateFunction(...) يمكن استخدامه لمزيد من المعالجة أو تخزينه في جدول لإكمال التجميع لاحقًا.
يرجى ملاحظة أن -MapState ليس ثابتًا للبيانات نفسها، لأن ترتيب البيانات في الحالة الوسيطة قد يتغير، رغم أن ذلك لا يؤثر في إدخال هذه البيانات.
- محرك الجدول AggregatingMergeTree.
- الدالة finalizeAggregation.
- الدالة runningAccumulate.
- combinator -Merge.
- combinator -MergeState.
-Merge
إذا طبّقت هذا المُركِّب، فإن دالة التجميع تأخذ حالة التجميع الوسيطة كوسيطة، ثم تدمج الحالات لاستكمال التجميع وتُرجِع القيمة الناتجة.-MergeState
يدمج حالات التجميع الوسيطة بالطريقة نفسها التي يعمل بها المُركِّب -Merge. لكنه لا يعيد القيمة الناتجة، بل يعيد حالة تجميع وسيطة، على غرار المُركِّب -State.-ForEach
يحوّل دالة تجميع تُستخدم مع الجداول إلى دالة تجميع للمصفوفات، بحيث تُجمِّع العناصر المناظرة في المصفوفات وتُرجع مصفوفة من النتائج. على سبيل المثال، تُرجعsumForEach للمصفوفات [1, 2] و[3, 4, 5] و[6, 7] النتيجة [10, 13, 5] بعد جمع العناصر المناظرة معًا.
-Tuple
يمكن إلحاق اللاحقة-Tuple بأي دالة تجميعية. تأخذ الدالة الناتجة وسيطًا واحدًا من النوع Tuple مقابل كل وسيط في الدالة التجميعية الأساسية، ويجب أن تحتوي جميع قيم Tuple على العدد نفسه من العناصر. ويُطبَّق التجميع بصورة مستقلة على موضع كل عنصر، بحيث يستقبل العنصر المناظر من كل Tuple، ويُرجع Tuple من النتائج.
إذا كان Tuple الأول في الإدخال يحتوي على أسماء صريحة للعناصر، فستُحفَظ هذه الأسماء في النتيجة.
الدوال التجميعية التي تتعامل مع قيم NULL بنفسها (anyRespectNulls وanyLastRespectNulls والمُعدِّل RESPECT NULLS) لا تدعم النوع Nullable(Tuple(...)) كوسيط؛ استخدم عناصر Nullable بدلًا من ذلك.
الصياغة
tuple1[, tuple2, ...]— أعمدة من النوعTuple، عمود واحد لكل وسيط من وسائط دالة التجميع الأساسية، على أن يكون لها جميعًا العدد نفسه من العناصر. ويجب أن يكون كل عنصر من نوع تدعمه دالة التجميع الأساسية في موضع ذلك الوسيط.
- قيمة
Tupleتحتوي على نتيجة تطبيق دالة التجميع على كل عنصر بشكل مستقل.
Tuple(aggFunction(element1), aggFunction(element2), ...).
مثال
الاستعلام:
GROUP BY:
Tuple وسيطًا واحدًا إلى الدالة الأساسية، وتُطابَق العناصر بحسب ترتيبها:
a1 و b1 مرتبطان عكسيًا، بينما a2 و b2 يتناسبان طرديًا، لذا تكون النتيجة (-1, 1).
يمكن دمج -Tuple مع مُركِّبات أخرى مثل -If. على سبيل المثال: sumTupleIf(tuple_column, cond).
-Distinct
لن يُحتسب كل تجميع لكل تركيبة فريدة من الوسائط إلا مرة واحدة فقط. وتُتجاهل القيم المتكررة. أمثلة:sum(DISTINCT x) (أو sumDistinct(x))، وgroupArray(DISTINCT x) (أو groupArrayDistinct(x))، وcorrStable(DISTINCT x, y) (أو corrStableDistinct(x, y)) وهكذا.
-OrDefault
يغيّر سلوك دالة تجميع. إذا لم تكن لدالة التجميع قيم إدخال، فإن هذا المُركِّب يجعلها تُرجع القيمة الافتراضية لنوع بيانات الإرجاع الخاص بها. ينطبق ذلك على دوال التجميع التي يمكنها قبول بيانات إدخال فارغة. يمكن استخدام-OrDefault مع مُركِّبات أخرى.
الصيغة
x— معلمات دالة التجميع.
Query
Response
-OrDefault مع combinators أخرى. ويكون ذلك مفيدًا عندما لا تقبل aggregate function مدخلات فارغة.
Query
Response
-OrNull
يغيّر سلوك دالة تجميعية. يحوّل هذا المُركِّب ناتج الدالة التجميعية إلى نوع البيانات Nullable. وإذا لم تتوفر للدالة التجميعية قيم لإجراء الحساب عليها، فإنها تُرجع NULL. يمكن استخدام-OrNull مع مُركِّبات أخرى.
البنية
x— وسيطات الدالة التجميعية.
- ناتج الدالة التجميعية بعد تحويله إلى نوع البيانات
Nullable. NULLإذا لم تكن هناك قيم لتجميعها.
Nullable(aggregate function return type).
مثال
أضف -orNull إلى نهاية اسم الدالة التجميعية.
Query
Response
-OrNull مع مُركِّبات أخرى. ويكون ذلك مفيدًا عندما لا تقبل الدالة التجميعية مُدخلًا فارغًا.
Query
Response
-Resample
يتيح لك تقسيم البيانات إلى مجموعات، ثم تجميع البيانات داخل تلك المجموعات كلٌّ على حدة. تُنشأ المجموعات بتقسيم قيم عمود واحد إلى فواصل زمنية.start— قيمة بداية الفاصل الزمني الكامل المطلوب لقيمresampling_key.stop— قيمة نهاية الفاصل الزمني الكامل المطلوب لقيمresampling_key. لا يشمل الفاصل الزمني الكامل القيمةstop[start, stop). ويجب أن تكون أكبر منstart: فالنطاق الذي لا يغطي أي فاصل زمني فرعي يرفع استثناءً.step— الخطوة المستخدمة لتقسيم الفاصل الزمني الكامل إلى فواصل زمنية فرعية. تُنفَّذaggFunctionعلى كل فاصل زمني فرعي من هذه الفواصل بشكل مستقل.resampling_key— العمود الذي تُستخدم قيمه لتقسيم البيانات إلى فواصل زمنية.aggFunction_params— معاملاتaggFunction.
- مصفوفة من نتائج
aggFunctionلكل فاصل زمني فرعي.
people الذي يحتوي على البيانات التالية:
[30,60) و[60,75). وبما أننا نستخدم الأعداد الصحيحة لتمثيل العمر، فإن الأعمار تقع ضمن الفاصلين الزمنيين [30, 59] و[60,74].
لتجميع الأسماء في مصفوفة، نستخدم الدالة التجميعية groupArray. وهي تأخذ وسيطًا واحدًا. في حالتنا، هذا هو العمود name. ويجب أن تستخدم الدالة groupArrayResample العمود age لتجميع الأسماء حسب العمر. ولتحديد الفواصل الزمنية المطلوبة، نمرّر الوسائط 30, 75, 30 إلى الدالة groupArrayResample.
John خارج العينة لأنه أصغر من الفئة العمرية المطلوبة. أمّا الأشخاص الآخرون فتوزيعهم يكون وفقًا للفواصل الزمنية العمرية المحددة.
والآن، لنحسب العدد الإجمالي للأشخاص ومتوسط أجورهم ضمن الفواصل الزمنية العمرية المحددة.
-ArgMin
يمكن إلحاق اللاحقة -ArgMin باسم أي دالة تجميعية. في هذه الحالة، تقبل الدالة التجميعية وسيطة إضافية يمكن أن تكون أي تعبير قابل للمقارنة. ولا تعالج الدالة التجميعية إلا الصفوف التي تحمل الحد الأدنى من القيمة للتعبير الإضافي المحدد. أمثلة:sumArgMin(column, expr), countArgMin(expr), avgArgMin(x, expr) وما إلى ذلك.