![ΠΠ°ΠΊ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΊΠΎΡ
ΠΎΡΡΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΈ Π² Grafana [+docker ΠΎΠ±ΡΠ°Π· Ρ ΠΏΡΠΈΠΌΠ΅Ρ]](/wp-content/uploads/2019/08/293a4d703ef9e7e69ee414be16217f1d.jpeg)
ΠΠ°ΠΊ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π·Π°Π΄Π°ΡΠ°ΡΠ° Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΊΠΎΠ³ΠΎΡΡΠΈ Π² ΡΡΠ»ΡΠ³Π°ΡΠ° Promopult Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Grafana.
Π΅ ΠΌΠΎΡΠ½Π° ΡΡΠ»ΡΠ³Π° Ρ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ. ΠΠ° 10 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°, Π±ΡΠΎΡΡ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈΡΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π°Π΄Ρ Π²ΡΡΠ»ΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½. Π’Π΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Π»ΠΈ Ρ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ, Π·Π½Π°ΡΡ, ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠΈΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π΄Π°Π»Π΅Ρ Π½Π΅ Π΅ Ρ ΠΎΠΌΠΎΠ³Π΅Π½Π΅Π½.
ΠΡΠΊΠΎΠΈ ΡΠ° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π»ΠΈ ΠΈ βΠ·Π°ΡΠΏΠ°Π»ΠΈβ Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ. ΠΡΠΊΠΎΠΈ Π·Π°Π±ΡΠ°Π²ΠΈΡ Π° ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° ΠΈ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Ρ Π° ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΡΠΈ Π·Π° ΠΏΠΎΠ»ΡΠ³ΠΎΠ΄ΠΈΠ΅. ΠΡΠΊΠΎΠΈ Π½ΠΎΡΡΡ ΠΏΠ°ΡΠΈ Π² ΠΊΠ°ΡΠ°ΡΠ°, Π° Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΡΠ»ΠΈ Π·Π° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ . Π Π΄ΠΎΠ±ΡΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΏΠ΅ΡΠ°Π»Π±Π° ΠΎΡ Π²ΡΠ΅ΠΊΠΈ.
ΠΡΠΈ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΡΠΈΡΠ΅, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΠΈ Π²Π·Π΅ΠΌΠ°Π½Π΅ΡΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎ-ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΅ Π±Π΅Π·ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π»ΠΎΠ²ΡΡ ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΠΈ ΠΈ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ Π³ΡΡΠΏΠΈ β ΡΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° ΠΏΡΠ°Π²ΠΈΠΌ.
ΠΡΠ°ΡΠΊΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅
- ΠΠ°ΠΊΠ²ΠΎ Π΅ ΠΊΠΎΠ³ΠΎΡΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π·Π°ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ.
- ΠΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΊΠΎΠ³ΠΎΡΡΠΈ ΠΏΠΎ ΠΌΠ΅ΡΠ΅Ρ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Ρ SQL.
- ΠΠ°ΠΊ Π΄Π° ΠΏΡΠ΅Π½Π΅ΡΠ΅ΠΌ ΠΊΠΎΠ³ΠΎΡΡΠΈ Π² .
ΠΠΊΠΎ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΠΊΠΎΠ³ΠΎΡΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Ρ 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:
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 ΠΎΠ±ΡΠ°Π· Ρ ΠΏΡΠΈΠΌΠ΅Ρ]](/wp-content/uploads/2019/08/9aa161a1d0e8fd7790875d4f12202d56.jpeg)
ΠΠ° Ρ Π²ΠΈΠ΄ΠΈΠΌ Π½Π° ΠΆΠΈΠ²ΠΎ:
β ΡΠΎΠ²Π° Π΅ docker ΠΎΠ±ΡΠ°Π· Ρ MySQL ΠΈ Grafana, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ° ΡΠΈ. Π Π±Π°Π·Π°ΡΠ° Π²Π΅ΡΠ΅ ΠΈΠΌΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°, ΠΎΡ ΡΠ½ΡΠ°ΡΠΈ 2018 Π΄ΠΎ ΡΠ»ΠΈ 2019.
ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ ΡΠ²ΠΎΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² ΡΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π·.
P.S. Π‘ΡΠ°ΡΠΈΠΈ Π·Π° ΠΊΠΎΡ ΠΎΡΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° SQL:
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
