> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# دوال التحليل - السلاسل الزمنية

> دوال لتحليل بيانات السلاسل الزمنية في ClickHouse.

يمكن إجراء تحليل السلاسل الزمنية في ClickHouse باستخدام دوال SQL القياسية للتجميع ودوال النوافذ.
وعند العمل مع بيانات السلاسل الزمنية، ستصادف عادةً ثلاثة أنواع رئيسية من المقاييس:

* مقاييس Counter التي تزداد باستمرار بمرور الوقت (مثل مشاهدات الصفحات أو إجمالي الأحداث)
* مقاييس Gauge التي تمثل قياسات لحظية يمكن أن ترتفع أو تنخفض (مثل استخدام CPU أو درجة الحرارة)
* المُدرَّجات التكرارية التي تجمع المشاهدات ضمن سلال وتحصي عددها (مثل مدد الطلبات أو أحجام الاستجابة)

وتشمل أنماط التحليل الشائعة لهذه المقاييس مقارنة القيم بين الفترات، وحساب الإجماليات التراكمية، وتحديد معدلات التغير، وتحليل التوزيعات.
ويمكن تحقيق كل ذلك من خلال الجمع بين دوال التجميع، ودوال النوافذ مثل `sum() OVER`، ودوال متخصصة مثل `histogram()`.

<div id="time-series-period-over-period-changes">
  ## التغيّرات بين الفترات
</div>

عند تحليل بيانات السلاسل الزمنية، نحتاج كثيرًا إلى فهم كيف تتغيّر القيم من فترة زمنية إلى أخرى.
وهذا أمر أساسي لكلٍّ من مقاييس Gauge ومقاييس Counter.
وتتيح لنا دالة النافذة [`lagInFrame`](/docs/ar/reference/functions/window-functions/lagInFrame) الوصول إلى قيمة الفترة السابقة لحساب هذه التغيّرات.

يوضح الاستعلام التالي ذلك من خلال حساب التغيّرات اليومية في مشاهدات صفحة Wikipedia الخاصة بـ "Weird Al" Yankovic.
ويبيّن عمود الاتجاه ما إذا كانت الزيارات قد ارتفعت (قيم موجبة) أو انخفضت (قيم سالبة) مقارنةً باليوم السابق، مما يساعد على رصد الارتفاعات أو الانخفاضات غير المعتادة في النشاط.

```sql theme={null}
SELECT
    toDate(time) AS day,
    sum(hits) AS h,
    lagInFrame(h) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS p,
    h - p AS trend
FROM wikistat
WHERE path = '"Weird_Al"_Yankovic'
GROUP BY ALL
LIMIT 10;
```

```text theme={null}
┌────────day─┬────h─┬────p─┬─trend─┐
│ 2015-05-01 │ 3934 │    0 │  3934 │
│ 2015-05-02 │ 3411 │ 3934 │  -523 │
│ 2015-05-03 │ 3195 │ 3411 │  -216 │
│ 2015-05-04 │ 3076 │ 3195 │  -119 │
│ 2015-05-05 │ 3450 │ 3076 │   374 │
│ 2015-05-06 │ 3053 │ 3450 │  -397 │
│ 2015-05-07 │ 2890 │ 3053 │  -163 │
│ 2015-05-08 │ 3898 │ 2890 │  1008 │
│ 2015-05-09 │ 3092 │ 3898 │  -806 │
│ 2015-05-10 │ 3508 │ 3092 │   416 │
└────────────┴──────┴──────┴───────┘
```

<div id="time-series-cumulative-values">
  ## القيم التراكمية
</div>

تتراكم مقاييس Counter بطبيعتها بمرور الوقت.
ولتحليل هذا النمو التراكمي، يمكننا حساب المجاميع التراكمية باستخدام دوال النافذة.

يوضح query التالي ذلك باستخدام عبارة `sum() OVER`، التي تُنشئ مجموعًا تراكميًا. وتوفّر الدالة `bar()` تمثيلًا مرئيًا لهذا النمو.

```sql theme={null}
SELECT
    toDate(time) AS day,
    sum(hits) AS h,
    sum(h) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING) AS c,
    bar(c, 0, 50000, 25) AS b
FROM wikistat
WHERE path = '"Weird_Al"_Yankovic'
GROUP BY ALL
ORDER BY day
LIMIT 10;
```

```text theme={null}
┌────────day─┬────h─┬─────c─┬─b─────────────────┐
│ 2015-05-01 │ 3934 │  3934 │ █▉                │
│ 2015-05-02 │ 3411 │  7345 │ ███▋              │
│ 2015-05-03 │ 3195 │ 10540 │ █████▎            │
│ 2015-05-04 │ 3076 │ 13616 │ ██████▊           │
│ 2015-05-05 │ 3450 │ 17066 │ ████████▌         │
│ 2015-05-06 │ 3053 │ 20119 │ ██████████        │
│ 2015-05-07 │ 2890 │ 23009 │ ███████████▌      │
│ 2015-05-08 │ 3898 │ 26907 │ █████████████▍    │
│ 2015-05-09 │ 3092 │ 29999 │ ██████████████▉   │
│ 2015-05-10 │ 3508 │ 33507 │ ████████████████▊ │
└────────────┴──────┴───────┴───────────────────┘
```

<div id="time-series-rate-calculations">
  ## حساب المعدلات
</div>

عند تحليل بيانات السلاسل الزمنية، غالبًا ما يكون من المفيد فهم معدل الأحداث لكل وحدة زمنية.
يحسب هذا الاستعلام معدل مشاهدات الصفحات في الثانية بقسمة الإجمالي لكل ساعة على عدد الثواني في الساعة (3600).
يساعد المخطط الشريطي في تحديد ساعات ذروة النشاط.

```sql theme={null}
SELECT
    toStartOfHour(time) AS time,
    sum(hits) AS hits,
    round(hits / (60 * 60), 2) AS rate,
    bar(rate * 10, 0, max(rate * 10) OVER (), 25) AS b
FROM wikistat
WHERE path = '"Weird_Al"_Yankovic'
GROUP BY time
LIMIT 10;
```

```text theme={null}
┌────────────────time─┬───h─┬─rate─┬─b─────┐
│ 2015-07-01 01:00:00 │ 143 │ 0.04 │ █▊    │
│ 2015-07-01 02:00:00 │ 170 │ 0.05 │ ██▏   │
│ 2015-07-01 03:00:00 │ 148 │ 0.04 │ █▊    │
│ 2015-07-01 04:00:00 │ 190 │ 0.05 │ ██▏   │
│ 2015-07-01 05:00:00 │ 253 │ 0.07 │ ███▏  │
│ 2015-07-01 06:00:00 │ 233 │ 0.06 │ ██▋   │
│ 2015-07-01 07:00:00 │ 359 │  0.1 │ ████▍ │
│ 2015-07-01 08:00:00 │ 190 │ 0.05 │ ██▏   │
│ 2015-07-01 09:00:00 │ 121 │ 0.03 │ █▎    │
│ 2015-07-01 10:00:00 │  70 │ 0.02 │ ▉     │
└─────────────────────┴─────┴──────┴───────┘
```

<div id="time-series-histograms">
  ## المدرجات التكرارية
</div>

من حالات الاستخدام الشائعة لبيانات السلاسل الزمنية إنشاء مدرجات تكرارية استنادًا إلى الأحداث المتتبعة.
لنفترض أننا نريد فهم توزيع الصفحات بحسب إجمالي `hits` لها، مع الاقتصار على الصفحات التي يزيد إجمالي `hits` فيها على 10,000.
يمكننا استخدام الدالة `histogram()` لإنشاء مُدرَّج تكراري تكيّفي تلقائيًا استنادًا إلى عدد الفئات:

```sql theme={null}
SELECT
    histogram(10)(hits) AS hist
FROM
(
    SELECT
        path,
        sum(hits) AS hits
    FROM wikistat
    WHERE date(time) = '2015-06-15'
    GROUP BY path
    HAVING hits > 10000
)
FORMAT Vertical;
```

```text theme={null}
Row 1:
──────
hist: [(10033,23224.55065359477,60.625),(23224.55065359477,37855.38888888889,15.625),(37855.38888888889,52913.5,3.5),(52913.5,69438,1.25),(69438,83102.16666666666,1.25),(83102.16666666666,94267.66666666666,2.5),(94267.66666666666,116778,1.25),(116778,186175.75,1.125),(186175.75,946963.25,1.75),(946963.25,1655250,1.125)]
```

يمكننا بعد ذلك استخدام [`arrayJoin()`](/docs/ar/reference/functions/regular-functions/array-join) لمعالجة البيانات و`bar()` لعرضها بصريًا:

```sql theme={null}
WITH histogram(10)(hits) AS hist
SELECT
    round(arrayJoin(hist).1) AS lowerBound,
    round(arrayJoin(hist).2) AS upperBound,
    arrayJoin(hist).3 AS count,
    bar(count, 0, max(count) OVER (), 20) AS b
FROM
(
    SELECT
        path,
        sum(hits) AS hits
    FROM wikistat
    WHERE date(time) = '2015-06-15'
    GROUP BY path
    HAVING hits > 10000
);
```

```text theme={null}
┌─lowerBound─┬─upperBound─┬──count─┬─b────────────────────┐
│      10033 │      19886 │ 53.375 │ ████████████████████ │
│      19886 │      31515 │ 18.625 │ ██████▉              │
│      31515 │      43518 │  6.375 │ ██▍                  │
│      43518 │      55647 │  1.625 │ ▌                    │
│      55647 │      73602 │  1.375 │ ▌                    │
│      73602 │      92880 │   3.25 │ █▏                   │
│      92880 │     116778 │  1.375 │ ▌                    │
│     116778 │     186176 │  1.125 │ ▍                    │
│     186176 │     946963 │   1.75 │ ▋                    │
│     946963 │    1655250 │  1.125 │ ▍                    │
└────────────┴────────────┴────────┴──────────────────────┘
```
