ΠΠ°ΠΊ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π·Π°Π΄Π°ΡΡ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ³ΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΡΠ΅ΡΠ²ΠΈΡΠ΅ Promopult c ΠΏΠΎΠΌΠΎΡΡΡ Grafana.
ΠΡΠΎ-ΡΠΎ Π·Π°ΡΠ΅Π³Π°Π»ΡΡ ΠΈ Β«ΡΡΠ½ΡΠ»Β» Π½Π°Π²Π΅ΠΊΠΈ. ΠΡΠΎ-ΡΠΎ Π·Π°Π±ΡΠ» ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ Π·Π°ΡΠ΅Π³Π°Π»ΡΡ Π΅ΡΠ΅ ΠΏΠ°ΡΡ ΡΠ°Π· Π·Π° ΠΏΠΎΠ»Π³ΠΎΠ΄Π°. ΠΡΠΎ-ΡΠΎ Π½Π΅ΡΠ΅Ρ Π΄Π΅Π½ΡΠ³ΠΈ Π² ΠΊΠ°ΡΡΡ, Π° ΠΊΡΠΎ-ΡΠΎ ΠΏΡΠΈΡΠ΅Π» Π·Π° Ρ
Π°Π»ΡΠ²Π½ΡΠΌΠΈ
ΠΠ° ΡΠ°ΠΊΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π°Ρ Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ Ρ Π½Π°Ρ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ·Π΅ΡΠ° ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΌΠΈΠΊΡΠΎ-ΡΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ. Π Π²ΠΎΡ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΡΠ΅Π½Π΄Ρ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π³ΡΡΠΏΠΏΠ°ΠΌΠΈ β ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½ΡΠΆΠ½ΠΎ. Π§ΡΠΎ ΠΌΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ.
ΠΡΠ°ΡΠΊΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΠΎΠ³ΠΎΡΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ Π½ΡΠΆΠ΅Π½.
- ΠΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ³ΠΎΡΡΡ ΠΏΠΎ ΠΌΠ΅ΡΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° SQL.
- ΠΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΠΊΠΎΠ³ΠΎΡΡΡ Π²
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
CΡΠΈΡΠ°Π΅ΠΌ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΌΠ΅ΡΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ β Π³ΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎ 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 ΡΠΎΡΠΌΠ°Ρ:
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.
ΠΡΠΈΠΌΠ΅Ρ Π³ΡΠ°ΡΠΈΠΊΠ° ΠΈΠ·
ΠΠΎΡΡΠΎΠ³Π°ΡΡ ΡΡΠΊΠ°ΠΌΠΈ:
ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠ²ΠΎΠΈ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΡΠΎΡ ΠΎΠ±ΡΠ°Π·.
P.S. Π‘ΡΠ°ΡΡΠΈ ΠΏΡΠΎ ΠΊΠΎΠ³ΠΎΡΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· Π½Π° SQL:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com