Как Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΡ…ΠΎΡ€Ρ‚ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π² Grafana [+docker-ΠΎΠ±Ρ€Π°Π· с ΠΏΡ€ΠΈΠΌΠ΅Ρ€]

Как Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΡ…ΠΎΡ€Ρ‚ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π² Grafana [+docker-ΠΎΠ±Ρ€Π°Π· с ΠΏΡ€ΠΈΠΌΠ΅Ρ€]

Как Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° визуализация Π½Π° ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π² услугата Promopult с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Grafana.

Promopult β€” ΠΌΠΎΡ‰Π½Π° услуга с голям Π±Ρ€ΠΎΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ. ΠŸΡ€Π΅Π· 10-Ρ‚Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°, броят Π½Π° рСгистрациитС Π² систСмата Π½Π°Π΄Ρ…Π²ΡŠΡ€Π»ΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½. Π’Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са ΠΈΠΌΠ°Π»ΠΈ ΠΎΠΏΠΈΡ‚ с ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ услуги, знаят, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ масив ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π΄Π°Π»Π΅Ρ‡ Π½Π΅ Π΅ Ρ…ΠΎΠΌΠΎΠ³Π΅Π½Π΅Π½.

Някои сС рСгистрираха ΠΈ Π½Π°Π²Π΅ΠΊΠΈ 'заспаха'. Някои Π·Π°Π±Ρ€Π°Π²ΠΈΡ…Π° ΠΏΠ°Ρ€ΠΎΠ»Π°Ρ‚Π° ΠΈ сС рСгистрираха ΠΎΡ‰Π΅ няколко ΠΏΡŠΡ‚ΠΈ Π·Π° ΡˆΠ΅ΡΡ‚ мСсСца. Някои ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ ΠΏΠ°Ρ€ΠΈ Π² касата, Π° Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΠΎΠΉΠ΄ΠΎΡ…Π° Π·Π° Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΈ инструмСнти. И Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ някаква ΠΏΠ΅Ρ‡Π°Π»Π±Π° ΠΎΡ‚ всСки.

На Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π³ΠΎΠ»Π΅ΠΌΠΈ масиви ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΠΊΠ²ΠΈΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅, Π°Π½Π°Π»ΠΈΠ·ΡŠΡ‚ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈ Π²Π·Π΅ΠΌΠ°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΠΈΠΊΡ€ΠΎ-Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΅ бСзсмислСн. Но Π΄Π° улавямС Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΈ ΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ с Π³ΠΎΠ»Π΅ΠΌΠΈ Π³Ρ€ΡƒΠΏΠΈ β€” ΠΌΠΎΠΆΠ΅ΠΌ ΠΈ трябва. Π’ΠΎΠ²Π° Π΅ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌ.

ΠšΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π΅Π·ΡŽΠΌΠ΅

  1. Какво Π΅ ΠΊΠΎΠ³ΠΎΡ€Ρ‚Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π·Π°Ρ‰ΠΎ Π΅ Π½ΡƒΠΆΠ΅Π½.
  2. Как Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ ΠΏΠΎ мСсСц Π½Π° рСгистрация Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π² SQL.
  3. Как Π΄Π° прСнСсСм ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ Π² Grafana.

Ако Π²Π΅Ρ‡Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΠΊΠΎΠ³ΠΎΡ€Ρ‚Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Π² SQL, Π½Π°ΠΏΡ€Π°Π²ΠΎ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към послСдния Ρ€Π°Π·Π΄Π΅Π».

1. Какво Π΅ ΠΊΠΎΠ³ΠΎΡ€Ρ‚Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π·Π°Ρ‰ΠΎ Π΅ Π½ΡƒΠΆΠ΅Π½

ΠšΠΎΠ³ΠΎΡ€Ρ‚Π½ΠΈΡΡ‚ Π°Π½Π°Π»ΠΈΠ· Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄, основан Π½Π° сравнСниСто Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€ΡƒΠΏΠΈ (ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ) ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ. Най-чСсто Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π³Ρ€ΡƒΠΏΠΈΡ‚Π΅ ΠΏΠΎ сСдмица ΠΈΠ»ΠΈ мСсСц, Π² ΠΊΠΎΠΉΡ‚ΠΎ потрСбитСлят Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π°Π» Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° услугата. ΠžΡ‚Ρ‚ΡƒΠΊ сС изчислява Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚ Π½Π° потрСбитСля, Π° Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π», Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Ρ‚ относитСлно слоТни Π°Π½Π°Π»ΠΈΠ·ΠΈ. НапримСр, Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ:

  • ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π»ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΈΠ²Π»ΠΈΡ‡Π°Π½Π΅ влияС Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚ Π½Π° потрСбитСля;
  • ΠΊΠ°ΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° някоя функция ΠΈΠ»ΠΈ услуга влияС Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚;
  • ΠΊΠ°ΠΊ стартиранС Π½Π° функция X Π΅ повлияло Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚ Π² сравнСниС с ΠΌΠΈΠ½Π°Π»Π°Ρ‚Π° Π³ΠΎΠ΄ΠΈΠ½Π°.

2. Как Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ Π² SQL?

Π Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° статията ΠΈ здравият Ρ€Π°Π·ΡƒΠΌ Π½Π΅ позволяват Π΄Π° прСдставим Ρ€Π΅Π°Π»Π½ΠΈΡ‚Π΅ наши Π΄Π°Π½Π½ΠΈ Ρ‚ΡƒΠΊ β€” Π² тСстовия Π΄Π°ΠΌΠΏ статистиката Π΅ Π·Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°: 1200 ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΈ 53 000 Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΠΏΠΎΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅ с Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΡ…ΠΌΠ΅ docker-ΠΎΠ±Ρ€Π°Π· с MySQL ΠΈ Grafana, Π² ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° СкспСримСнтиратС сами. Π›ΠΈΠ½ΠΊΡŠΡ‚ към GitHub Π΅ Π² края Π½Π° статията.

А Ρ‚ΡƒΠΊ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ Π½Π° опростСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

НСка ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ услуга. Π’ нСя сС рСгистрират ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΈ Ρ…Π°Ρ€Ρ‡Π°Ρ‚ ΠΏΠ°Ρ€ΠΈ Π·Π° услуги. Π‘ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΎΡ‚ΠΏΠ°Π΄Π°Ρ‚. ИскамС Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΠ»ΠΊΠΎ дълго ТивСят ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΈ ΠΊΠΎΠ»ΠΊΠΎ ΠΎΡ‚ тях ΠΎΡ‚ΠΏΠ°Π΄Π°Ρ‚ слСд 1-ия ΠΈ 2-ия мСсСц ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° услугата.

Π—Π° Π΄Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π° Ρ‚Π΅Π·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ, Π½ΡƒΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ ΠΏΠΎ мСсСц Π½Π° рСгистрация. Активността Ρ‰Π΅ ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°ΠΌΠ΅ ΠΏΠΎ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° всСки мСсСц. ВмСсто Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΡ€ΡŠΡ‡ΠΊΠΈ, Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ‚Π½Π° такса ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³Π° активност, ΡΠ²ΡŠΡ€Π·Π°Π½Π° с Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ.

Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ са Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ Π² MySQL, Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Π‘Π£Π‘Π” Π½Π΅ Π±ΠΈ трябвало Π΄Π° ΠΈΠΌΠ° ΡΡŠΡ‰Π΅ΡΡ‚Π²Π΅Π½ΠΈ Ρ€Π°Π·Π»ΠΈΠΊΠΈ.

Π’Π°Π±Π»ΠΈΡ†Π° с ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ β€” users:

userId
RegistrationDate

1
2019-01-01

2
2019-02-01

3
2019-02-10

4
2019-03-01

Π’Π°Π±Π»ΠΈΡ†Π° с Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈ β€” billing:

userId
Date
Sum

1
2019-01-02
11

1
2019-02-22
11

2
2019-02-12
12

3
2019-02-11
13

3
2019-03-11
13

4
2019-03-01
14

4
2019-03-02
14

Π˜Π·Π±ΠΈΡ€Π°ΠΌΠ΅ всички такси Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΈ Π΄Π°Ρ‚Π°Ρ‚Π° Π½Π° рСгистрация:

SELECT 
  b.userId, 
  b.Date,
  u.RegistrationDate
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚:

userId
Date
RegistrationDate

1
2019-01-02
2019-01-02

1
2019-02-22
2019-01-02

2
2019-02-12
2019-02-01

3
2019-02-11
2019-02-10

3
2019-03-11
2019-02-10

4
2019-03-01
2019-03-01

4
2019-03-02
2019-03-01

Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ ΠΏΠΎ мСсСци, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ всички Π΄Π°Ρ‚ΠΈ Π² мСсСци:

DATE_FORMAT(Date, '%Y-%m')

Π‘Π΅Π³Π° трябва Π΄Π° Π·Π½Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΊΠΎ мСсСца потрСбитСлят Π΅ Π±ΠΈΠ» Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ β€” Ρ‚ΠΎΠ²Π° Π΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ мСсСца Π½Π° таксата ΠΈ мСсСца Π½Π° рСгистрацията. Π’ MySQL ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° функцията PERIOD_DIFF() β€” Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° мСсСца. ДобавямС PERIOD_DIFF() Π² Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ:

SELECT
    b.userId,
    DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
    DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
    PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId

userId
BillingMonth
RegistrationDate
MonthsDiff

1
2019-01
2019-01
0

1
2019-02
2019-01
1

2
2019-02
2019-02
0

3
2019-02
2019-02
0

3
2019-03
2019-02
1

4
2019-03
2019-03
0

4
2019-03
2019-03
0

Π˜Π·Ρ‡ΠΈΡΠ»ΡΠ²Π°ΠΌΠ΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π·Π° всСки мСсСц β€” Π³Ρ€ΡƒΠΏΠΈΡ€Π°ΠΌΠ΅ записитС ΠΏΠΎ BillingMonth, RegistrationMonth ΠΈ MonthsDiff:

SELECT
    COUNT(DISTINCT(b.userId)) AS UsersCount,
    DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
    DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
    PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
GROUP BY BillingMonth, RegistrationMonth, MonthsDiff

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚:

UsersCount
BillingMonth
RegistrationMonth
MonthsDiff

1
2019-01
2019-01
0

1
2019-02
2019-01
1

2
2019-02
2019-02
0

1
2019-03
2019-02
1

1
2019-03
2019-03
0

ΠŸΡ€Π΅Π· януари, Ρ„Π΅Π²Ρ€ΡƒΠ°Ρ€ΠΈ ΠΈ ΠΌΠ°Ρ€Ρ‚ сС Π΅ появил ΠΏΠΎ Π΅Π΄ΠΈΠ½ Π½ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» β€” MonthsDiff = 0. Π•Π΄ΠΈΠ½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΎΡ‚ януари Π΅ Π±ΠΈΠ» Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΈ ΠΏΡ€Π΅Π· Ρ„Π΅Π²Ρ€ΡƒΠ°Ρ€ΠΈ β€” RegistrationMonth = 2019-01, BillingMonth = 2019-02, ΡΡŠΡ‰ΠΎ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΅Π΄ΠΈΠ½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΎΡ‚ Ρ„Π΅Π²Ρ€ΡƒΠ°Ρ€ΠΈ Π΅ Π±ΠΈΠ» Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΏΡ€Π΅Π· ΠΌΠ°Ρ€Ρ‚.

ΠŸΡ€ΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ закономСрноститС, СстСствСно, сС Π²ΠΈΠΆΠ΄Π°Ρ‚ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅.

Как Π΄Π° прСнСсСм ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ Π² Grafana

НаучихмС сС Π΄Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ, Π½ΠΎ ΠΊΠΎΠ³Π°Ρ‚ΠΎ записитС станат ΠΌΠ½ΠΎΠ³ΠΎ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ Π²Π΅Ρ‡Π΅ Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. ЗаписитС ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС Скспортират Π² Excel ΠΈ Π΄Π° сС оформят красиви Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Π½Π°ΡˆΠΈΡΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄!

ΠšΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΏΠΎΠΊΠ°ΠΆΠ°Ρ‚ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ° Π² Grafana.

Π—Π° Ρ‚ΠΎΠ²Π° добавямС ΠΎΡ‰Π΅ Π΅Π΄Π½Π° заявка, Π·Π° Π΄Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² подходящ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° Grafana:

SELECT
  DATE_ADD(CONCAT(s.RegistrationMonth, '-01'), INTERVAL s.MonthsDiff MONTH) AS time_sec,
  SUM(s.Users) AS value,
  s.RegistrationMonth AS metric
FROM (
  ## стара заявка, Π²Ρ€ΡŠΡ‰Π°Ρ‰Π° ΠΊΠΎΠ³ΠΎΡ€Ρ‚ΠΈ
  SELECT 
    COUNT(DISTINCT(b.userId)) AS Users, 
    DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
    DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
    PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
  FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
  WHERE
    u.RegistrationDate BETWEEN '2018-01-01' AND CURRENT_DATE
  GROUP BY 
    BillingMonth, RegistrationMonth, MonthsDiff 
) AS s
GROUP BY 
  time_sec, metric

И СкспортирамС Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² Grafana.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΎΡ‚ Π΄Π΅ΠΌΠΎ:

Как Π΄Π° ΡΡŠΠ±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΡ…ΠΎΡ€Ρ‚ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π² Grafana [+docker-ΠΎΠ±Ρ€Π°Π· с ΠΏΡ€ΠΈΠΌΠ΅Ρ€]

ΠŸΠΈΠΏΠ½Π΅Ρ‚Π΅ с Ρ€ΡŠΡ†Π΅:

GitHub Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Ρ‚ΠΎΠ²Π° Π΅ docker ΠΎΠ±Ρ€Π°Π· с MySQL ΠΈ Grafana, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС стартира Π½Π° вашия ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€. Π’ Π±Π°Π·Π°Ρ‚Π° Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° Π΄Π΅ΠΌΠΎ Π΄Π°Π½Π½ΠΈ Π·Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°, ΠΎΡ‚ януари 2018 Π΄ΠΎ юли 2019.

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Ρ€Π΅Π΄ΠΈΡ‚Π΅ своитС Π΄Π°Π½Π½ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ ΠΎΠ±Ρ€Π°Π·.

P.S. Π‘Ρ‚Π°Ρ‚ΠΈΠΈ Π·Π° ΠΊΠΎΠ³ΠΎΡ€Ρ‚Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° SQL:

https://chartio.com/resources/tutorials/performing-cohort-analysis-using-mysql/

https://www.holistics.io/blog/calculate-cohort-retention-analysis-with-sql/

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster