![ΠΠ°ΠΊ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ΠΌ ΠΊΠΎΡ
ΠΎΡΡΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΈ Π² 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
