الانتقال إلى المحتوى الرئيسي
تعمل دوال التجميع بالطريقة المعتادة، كما هو متوقع لدى خبراء قواعد البيانات. كما يدعم ClickHouse ما يلي:

معالجة NULL

أثناء التجميع، يتم تجاهل جميع الوسيطات NULL. وإذا كان للتجميع عدة وسيطات، فسيتجاهل أي صف تكون فيه واحدة أو أكثر منها NULL. هناك استثناء لهذه القاعدة، وهو الدالتان first_value وlast_value وأسماؤهما المستعارة (any وanyLast على الترتيب) عند إلحاقهما بالمُعدِّل RESPECT NULLS. على سبيل المثال، FIRST_VALUE(b) RESPECT NULLS. أمثلة: لننظر إلى هذا الجدول:
┌─x─┬────y─┐
│ 1 │    2 │
│ 2 │ ᴺᵁᴸᴸ │
│ 3 │    2 │
│ 3 │    3 │
│ 3 │ ᴺᵁᴸᴸ │
└───┴──────┘
لنفترض أنك تحتاج إلى حساب مجموع القيم في العمود y:
SELECT sum(y) FROM t_null_big
┌─sum(y)─┐
│      7 │
└────────┘
يمكنك الآن استخدام الدالة groupArray لإنشاء مصفوفة من العمود y:
SELECT groupArray(y) FROM t_null_big
┌─groupArray(y)─┐
│ [2,2,3]       │
└───────────────┘
groupArray لا يتضمن NULL في المصفوفة الناتجة. يمكنك استخدام COALESCE لتحويل NULL إلى قيمة مناسبة لحالة الاستخدام لديك. على سبيل المثال: سيستخدم avg(COALESCE(column, 0)) قيمة العمود في التجميع، أو الصفر إذا كانت NULL:
SELECT
    avg(y),
    avg(coalesce(y, 0))
FROM t_null_big
┌─────────────avg(y)─┬─avg(coalesce(y, 0))─┐
│ 2.3333333333333335 │                 1.4 │
└────────────────────┴─────────────────────┘
يمكنك أيضًا استخدام Tuple لتجاوز سلوك تخطي NULL. إن Tuple الذي يحتوي فقط على قيمة NULL لا يُعد NULL، لذلك لن تتخطى دالة التجميع ذلك الصف بسبب قيمة NULL هذه.
SELECT
    groupArray(y),
    groupArray(tuple(y)).1
FROM t_null_big;

┌─groupArray(y)─┬─tupleElement(groupArray(tuple(y)), 1)─┐
│ [2,2,3]       │ [2,NULL,2,3,NULL]                     │
└───────────────┴───────────────────────────────────────┘
لاحظ أن عمليات التجميع يتم تجاهلها عندما تُستخدم الأعمدة كوسائط لدالة التجميع. على سبيل المثال، فإن count بدون وسائط (count()) أو مع وسائط ثابتة (count(1)) سيحسب جميع الصفوف في الكتلة (بغض النظر عن قيمة عمود GROUP BY لأنه ليس وسيطًا)، بينما count(column) لن يعيد إلا عدد الصفوف التي لا تكون فيها قيمة column هي NULL.
SELECT
    v,
    count(1),
    count(v)
FROM
(
    SELECT if(number < 10, NULL, number % 3) AS v
    FROM numbers(15)
)
GROUP BY v

┌────v─┬─count()─┬─count(v)─┐
│ ᴺᵁᴸᴸ │      100
011
122
222
└──────┴─────────┴──────────┘
وهنا مثال على first_value مع RESPECT NULLS، حيث نرى أن قيم الإدخال NULL تتم مراعاتها، وسيُرجع أول قيمة مقروءة، سواء كانت NULL أم لا:
SELECT
    col || '_' || ((col + 1) * 5 - 1) AS range,
    first_value(odd_or_null) AS first,
    first_value(odd_or_null) IGNORE NULLS as first_ignore_null,
    first_value(odd_or_null) RESPECT NULLS as first_respect_nulls
FROM
(
    SELECT
        intDiv(number, 5) AS col,
        if(number % 2 == 0, NULL, number) AS odd_or_null
    FROM numbers(15)
)
GROUP BY col
ORDER BY col

┌─range─┬─first─┬─first_ignore_null─┬─first_respect_nulls─┐
│ 0_4   │     11 │                ᴺᵁᴸᴸ │
│ 1_9   │     555
│ 2_14  │    1111 │                ᴺᵁᴸᴸ │
└───────┴───────┴───────────────────┴─────────────────────┘
آخر تعديل في ٢٥ يونيو ٢٠٢٦