> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# avgMergeState

> مثال على استخدام المركّب avgMergeState

<div id="description">
  ## الوصف
</div>

يمكن تطبيق المُركِّب [`MergeState`](/ar/reference/functions/aggregate-functions/combinators#-state)
على الدالة [`avg`](/ar/reference/functions/aggregate-functions/avg)
لدمج حالات التجميع الجزئية من النوع `AverageFunction(avg, T)`،
وإرجاع حالة تجميع وسيطة جديدة.

<div id="example-usage">
  ## مثال على الاستخدام
</div>

يُعد المُركِّب `MergeState` مفيدًا بشكل خاص في
سيناريوهات التجميع متعددة المستويات، حيث تحتاج إلى دمج الحالات المجمّعة مسبقًا
والاحتفاظ بها كحالات
(بدلًا من إنهائها) لمزيد من المعالجة. ولتوضيح ذلك، سنستعرض
مثالًا نحوّل فيه مقاييس أداء الخوادم الفردية
إلى تجميعات هرمية عبر عدة مستويات: مستوى الخادم → مستوى المنطقة
→ مستوى مركز البيانات.

أولًا، ننشئ جدولًا لتخزين البيانات الخام:

```sql theme={null}
CREATE TABLE raw_server_metrics
(
    timestamp DateTime DEFAULT now(),
    server_id UInt32,
    region String,
    datacenter String,
    response_time_ms UInt32
)
ENGINE = MergeTree()
ORDER BY (region, server_id, timestamp);
```

سننشئ جدول هدف للتجميع على مستوى الخادم، ونعرّف عرضًا ماديًا تزايديًا
يعمل كمشغّل إدراج له:

```sql theme={null}
CREATE TABLE server_performance
(
    server_id UInt32,
    region String,
    datacenter String,
    avg_response_time AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY (region, server_id);

CREATE MATERIALIZED VIEW server_performance_mv
TO server_performance
AS SELECT
    server_id,
    region,
    datacenter,
    avgState(response_time_ms) AS avg_response_time
FROM raw_server_metrics
GROUP BY server_id, region, datacenter;
```

سنطبّق الأمر نفسه على مستويي المنطقة ومركز البيانات:

```sql theme={null}
CREATE TABLE region_performance
(
    region String,
    datacenter String,
    avg_response_time AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY (datacenter, region);

CREATE MATERIALIZED VIEW region_performance_mv
TO region_performance
AS SELECT
    region,
    datacenter,
    avgMergeState(avg_response_time) AS avg_response_time
FROM server_performance
GROUP BY region, datacenter;

-- datacenter level table and materialized view

CREATE TABLE datacenter_performance
(
    datacenter String,
    avg_response_time AggregateFunction(avg, UInt32)
)
ENGINE = AggregatingMergeTree()
ORDER BY datacenter;

CREATE MATERIALIZED VIEW datacenter_performance_mv
TO datacenter_performance
AS SELECT
      datacenter,
      avgMergeState(avg_response_time) AS avg_response_time
FROM region_performance
GROUP BY datacenter;
```

سنُدرِج بعد ذلك بيانات خام تجريبية في الجدول المصدر:

```sql theme={null}
INSERT INTO raw_server_metrics (timestamp, server_id, region, datacenter, response_time_ms) VALUES
    (now(), 101, 'us-east', 'dc1', 120),
    (now(), 101, 'us-east', 'dc1', 130),
    (now(), 102, 'us-east', 'dc1', 115),
    (now(), 201, 'us-west', 'dc1', 95),
    (now(), 202, 'us-west', 'dc1', 105),
    (now(), 301, 'eu-central', 'dc2', 145),
    (now(), 302, 'eu-central', 'dc2', 155);
```

سنكتب ثلاثة استعلامات لكل مستوى من هذه المستويات:

<Tabs>
  <Tab title="مستوى الخدمة">
    ```sql theme={null}
    SELECT
        server_id,
        region,
        avgMerge(avg_response_time) AS avg_response_ms
    FROM server_performance
    GROUP BY server_id, region
    ORDER BY region, server_id;
    ```

    ```response theme={null}
    ┌─server_id─┬─region─────┬─avg_response_ms─┐
    │       301 │ eu-central │             145 │
    │       302 │ eu-central │             155 │
    │       101 │ us-east    │             125 │
    │       102 │ us-east    │             115 │
    │       201 │ us-west    │              95 │
    │       202 │ us-west    │             105 │
    └───────────┴────────────┴─────────────────┘
    ```
  </Tab>

  <Tab title="المستوى الإقليمي">
    ```sql theme={null}
    SELECT
        region,
        datacenter,
        avgMerge(avg_response_time) AS avg_response_ms
    FROM region_performance
    GROUP BY region, datacenter
    ORDER BY datacenter, region;
    ```

    ```response theme={null}
    ┌─region─────┬─datacenter─┬────avg_response_ms─┐
    │ us-east    │ dc1        │ 121.66666666666667 │
    │ us-west    │ dc1        │                100 │
    │ eu-central │ dc2        │                150 │
    └────────────┴────────────┴────────────────────┘
    ```
  </Tab>

  <Tab title="مستوى مركز البيانات">
    ```sql theme={null}
    SELECT
        datacenter,
        avgMerge(avg_response_time) AS avg_response_ms
    FROM datacenter_performance
    GROUP BY datacenter
    ORDER BY datacenter;
    ```

    ```response theme={null}
    ┌─datacenter─┬─avg_response_ms─┐
    │ dc1        │             113 │
    │ dc2        │             150 │
    └────────────┴─────────────────┘
    ```
  </Tab>
</Tabs>

يمكننا إدراج المزيد من البيانات:

```sql theme={null}
INSERT INTO raw_server_metrics (timestamp, server_id, region, datacenter, response_time_ms) VALUES
    (now(), 101, 'us-east', 'dc1', 140),
    (now(), 201, 'us-west', 'dc1', 85),
    (now(), 301, 'eu-central', 'dc2', 135);
```

دعنا نتحقق مرة أخرى من الأداء على مستوى مركز البيانات. لاحظ كيف تم تحديث سلسلة
التجميع بأكملها تلقائيًا:

```sql theme={null}
SELECT
    datacenter,
    avgMerge(avg_response_time) AS avg_response_ms
FROM datacenter_performance
GROUP BY datacenter
ORDER BY datacenter;
```

```response theme={null}
┌─datacenter─┬────avg_response_ms─┐
│ dc1        │ 112.85714285714286 │
│ dc2        │                145 │
└────────────┴────────────────────┘
```

<div id="see-also">
  ## راجع أيضًا
</div>

* [`avg`](/ar/reference/functions/aggregate-functions/avg)
* [`AggregateFunction`](/ar/reference/data-types/aggregatefunction)
* [`Merge`](/ar/reference/functions/aggregate-functions/combinators#-merge)
* [`MergeState`](/ar/reference/functions/aggregate-functions/combinators#-mergestate)
