![Grafana рдорд╛ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ [+ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде рдбрдХрд░ рдЫрд╡рд┐]](/wp-content/uploads/2019/08/293a4d703ef9e7e69ee414be16217f1d.jpeg)
рд╣рд╛рдореАрд▓реЗ Grafana рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░реЛрдореЛрдкрд▓реНрдЯ рд╕реЗрд╡рд╛рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рдореВрд╣рдХреЛ рджреГрд╢реНрдпрд╛рд╡рд▓реЛрдХрди рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рд▓рд╛рдИ рдХрд╕рд░реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВред
- рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд╕рд╛рде рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реЗрд╡рд╛ред рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ резреж рд╡рд░реНрд╖рдорд╛, рдкреНрд░рдгрд╛рд▓реАрдорд╛ рджрд░реНрддрд╛рдХреЛ рд╕рдВрдЦреНрдпрд╛ резреж рд▓рд╛рдЦ рдирд╛рдШреЗрдХреЛ рдЫред рд╕рдорд╛рди рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреЗрд╣рд░реВрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдпреЛ рдПрд░реНрд░реЗ рдПрдХрд░реВрдкрддрд╛рдмрд╛рдЯ рдЯрд╛рдврд╛ рдЫред
рдХрд╕реИрд▓реЗ рд╕рд╛рдЗрди рдЕрдк рдЧрд░реНрдпреЛ рд░ рд╕рджрд╛рдХреЛ рд▓рд╛рдЧрд┐ "рдирд┐рджрд╛рдпреЛ"ред рдХрд╕реИрд▓реЗ рдЖрдлреНрдиреЛ рдкрд╛рд╕рд╡рд░реНрдб рдмрд┐рд░реНрд╕реНрдпреЛ рд░ рдЫ рдорд╣рд┐рдирд╛рдХреЛ рдЕрд╡рдзрд┐рдорд╛ рджреБрдИ рдкрдЯрдХ рдердк рджрд░реНрддрд╛ рдЧрд░реНрдпреЛред рдХрд╕реИрд▓реЗ рдирдЧрдж рджрд░реНрддрд╛рдорд╛ рдкреИрд╕рд╛ рд▓реНрдпрд╛рдЙрдБрдЫ, рд░ рдХреЛрд╣реА рд╕рд┐рддреНрддреИрдорд╛ рдЖрдпреЛ ред рд░ рд╕рдмреИрдмрд╛рдЯ рдХреЗрд╣реА рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫред
рд╣рд╛рдореНрд░реЛ рдЬрд╕реНрддреЛ рдареВрд▓рд╛ рдбрд╛рдЯрд╛ рд╕реЗрдЯрд╣рд░реВрдорд╛, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд░ рд╕реВрдХреНрд╖реНрдо рдирд┐рд░реНрдгрдпрд╣рд░реВ рдЧрд░реНрдиреБ рд╡реНрдпрд░реНрде рдЫред рддрд░ рдкреНрд░рд╡реГрддреНрддрд┐рд╣рд░реВ рд╕рдорд╛рддреНрди рд░ рдареВрд▓рд╛ рд╕рдореВрд╣рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдореНрднрд╡ рд░ рдЖрд╡рд╢реНрдпрдХ рдЫред рдЬреБрди рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рдЧрд░реНрдЫреМрдВред
рд╕рд╛рд░рд╛рдВрд╢
- рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╣реЛ рд░ рдпреЛ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ?
- SQL рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рджрд░реНрддрд╛рдХреЛ рдорд╣рд┐рдирд╛рдорд╛ рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗред
- рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВрд▓рд╛рдИ рдХрд╕рд░реА рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ .
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╣реЛ рд░ рдпрд╕рд▓рд╛рдИ SQL рдорд╛ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдерд╛рд╣рд╛ рдЫ рднрдиреЗ, рд╕рд┐рдзреИ рдЕрдиреНрддрд┐рдо рдЦрдгреНрдбрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реНред
1. рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╣реЛ рд░ рдпреЛ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ?
рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рднрдиреЗрдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдореВрд╣рд╣рд░реВ (рд╕рдореВрд╣рд╣рд░реВ) рддреБрд▓рдирд╛ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рд╣реЛред рдкреНрд░рд╛рдпрдЬрд╕реЛ, рд╣рд╛рдореНрд░рд╛ рд╕рдореВрд╣рд╣рд░реВ рд╣рдкреНрддрд╛ рд╡рд╛ рдорд╣рд┐рдирд╛рдорд╛ рдмрдирд╛рдЗрдиреНрдЫ рдЬреБрди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдерд╛рд▓реЗред рдпрд╣рд╛рдБрдмрд╛рдЯ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЬреАрд╡рдирдХрд╛рд▓ рдЧрдгрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпреЛ рдПрдХ рд╕реВрдЪрдХ рд╣реЛ рдЬрд╕рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдмреБрдЭреНрдиреБрд╣реЛрд╕реН:
- рдХрд╕рд░реА рдЕрдзрд┐рдЧреНрд░рд╣рдг рдЪреНрдпрд╛рдирд▓рд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЬреАрд╡рдирдХрд╛рд▓рд▓рд╛рдИ рдкреНрд░рднрд╛рд╡ рдкрд╛рд░реНрдЫ;
- рдХреБрдиреИ рдкрдирд┐ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛ рд╕реЗрд╡рд╛рдХреЛ рдкреНрд░рдпреЛрдЧрд▓реЗ рдЬреАрд╡рдирднрд░рд▓рд╛рдИ рдХрд╕рд░реА рдЕрд╕рд░ рдЧрд░реНрдЫ;
- рдЧрдд рд╡рд░реНрд╖рдХреЛ рддреБрд▓рдирд╛рдорд╛ рд╕реБрд╡рд┐рдзрд╛ X рдХреЛ рд╕реБрд░реБрд╡рд╛рддрд▓реЗ рдЬреАрд╡рдирдХрд╛рд▓рд▓рд╛рдИ рдХрд╕рд░реА рдЕрд╕рд░ рдЧрд░реНрдпреЛред
2. SQL рдорд╛ рдХреЛрд╣реЛрд░реНрдЯреНрд╕ рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗ?
рд▓реЗрдЦрдХреЛ рдЖрдХрд╛рд░ рд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рдирд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд╛рдЯрд╛ рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрди - рдкрд░реАрдХреНрд╖рдг рдбрдореНрдкрдорд╛, рдбреЗрдв рд╡рд░реНрд╖рдХреЛ рддрдереНрдпрд╛рдЩреНрдХ: 1200 рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд░ 53 рд▓реЗрдирджреЗрдирд╣рд░реВред рддрдкрд╛рдИрдВ рдпреЛ рдбрд╛рдЯрд╛рд╕рдБрдЧ рдЦреЗрд▓реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗрд░, рд╣рд╛рдореАрд▓реЗ MySQL рд░ Grafana рд╕рдБрдЧ рдПрдХ рдбрдХрд░ рдЫрд╡рд┐ рддрдпрд╛рд░ рдЧрд░реЗрдХрд╛ рдЫреМрдВ рдЬрд╕рдорд╛ рддрдкрд╛рдИрдВ рдЖрдлреИрд▓реЗ рдпреЛ рд╕рдмреИ рдЕрдиреБрднрд╡ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд▓реЗрдЦрдХреЛ рдЕрдиреНрддреНрдпрдорд╛ GitHub рдорд╛ рд▓рд┐рдЩреНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рд░ рдпрд╣рд╛рдБ рд╣рд╛рдореА рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рджреЗрдЦрд╛рдЙрдиреЗрдЫреМрдВред
рдорд╛рдиреМрдВ рд╣рд╛рдореАрд╕рдБрдЧ рд╕реЗрд╡рд╛ рдЫред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рддреНрдпрд╣рд╛рдБ рджрд░реНрддрд╛ рдЧрд░реНрдЫрдиреН рд░ рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рдкреИрд╕рд╛ рдЦрд░реНрдЪ рдЧрд░реНрдЫрдиреНред рд╕рдордпрдХреЛ рд╕рд╛рде, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рдЫреЛрдбреНрдЫрдиреНред рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рдХрддрд┐ рд▓рд╛рдореЛ рд╕рдордпрд╕рдореНрдо рдмрд╛рдБрдЪреНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рд░ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдХрддрд┐ рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдХреЛ рдкрд╣рд┐рд▓реЛ рд░ рджреЛрд╕реНрд░реЛ рдорд╣рд┐рдирд╛ рдкрдЫрд┐ рд╣рдЯреНрдЫрдиреН рднрдиреНрдиреЗ рдХреБрд░рд╛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреМрдВред
рдпреА рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдЬрд╡рд╛рдл рджрд┐рди, рд╣рд╛рдореАрд▓реЗ рджрд░реНрддрд╛рдХреЛ рдорд╣рд┐рдирд╛рдорд╛ рдЖрдзрд╛рд░рд┐рдд рд╕рдореВрд╣рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╣рд╛рдореА рдкреНрд░рддреНрдпреЗрдХ рдорд╣рд┐рдирд╛рдорд╛ рдЦрд░реНрдЪ рджреНрд╡рд╛рд░рд╛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдорд╛рдкрди рдЧрд░реНрдиреЗрдЫреМрдВред рдЦрд░реНрдЪрдХреЛ рд╕рдЯреНрдЯрд╛, рддреНрдпрд╣рд╛рдБ рдЕрд░реНрдбрд░, рд╕рджрд╕реНрдпрддрд╛ рд╢реБрд▓реНрдХ, рд╡рд╛ рдХреБрдиреИ рдЕрдиреНрдп рд╕рдордп-рдЖрдзрд╛рд░рд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реБрди рд╕рдХреНрдЫред
рд╕реНрд░реЛрдд рдбрд╛рдЯрд╛
рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ MySQL рдорд╛ рдмрдирд╛рдЗрдПрдХрд╛ рдерд┐рдП, рддрд░ рдЕрдиреНрдп DBMS рдХреЛ рд▓рд╛рдЧрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рднрд┐рдиреНрдирддрд╛ рд╣реБрдиреБ рд╣реБрдБрджреИрдиред
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ - рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ:
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ ID
рджрд░реНрддрд╛ рдорд┐рддрд┐
1
2019-01-01
2
2019-02-01
3
2019-02-10
4
2019-03-01
рд▓рд╛рдЧрдд рддрд╛рд▓рд┐рдХрд╛ - рдмрд┐рд▓рд┐рдЩ:
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ ID
рдорд┐рддрд┐
рдпреЛрдЧ
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
рдкрд░рд┐рдгрд╛рдо:
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ ID
рдорд┐рддрд┐
рджрд░реНрддрд╛ рдорд┐рддрд┐
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
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ ID
рдмрд┐рд▓рд┐рдЩ рдорд╣рд┐рдирд╛
рджрд░реНрддрд╛ рдорд┐рддрд┐
рдорд╣рд┐рдирд╛рдХреЛ рдбрд┐рдл
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
рдкрд░рд┐рдгрд╛рдо:
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЧрдгрдирд╛
рдмрд┐рд▓рд┐рдЩ рдорд╣рд┐рдирд╛
рджрд░реНрддрд╛ рдорд╣рд┐рдирд╛
рдорд╣рд┐рдирд╛рдХреЛ рдбрд┐рдл
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 рдорд╛ рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ
рд╣рд╛рдореАрд▓реЗ рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗ рднрдиреЗрд░ рд╕рд┐рдХреЗрдХрд╛ рдЫреМрдВ, рддрд░ рдЬрдм рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдЫрдиреН, рдЕрдм рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫреИрдиред рд░реЗрдХрд░реНрдбрд╣рд░реВ рдПрдХреНрд╕реЗрд▓рдорд╛ рдирд┐рд░реНрдпрд╛рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд░ рд╕реБрдиреНрджрд░ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рдЧрдарди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рд╡рд┐рдзрд┐ рд╣реЛрдЗрди!
рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВрд▓рд╛рдИ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рджреЗрдЦрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ .
рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдбреЗрдЯрд╛рд▓рд╛рдИ 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 рдорд╛ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ [+ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде рдбрдХрд░ рдЫрд╡рд┐]](/wp-content/uploads/2019/08/9aa161a1d0e8fd7790875d4f12202d56.jpeg)
рдЖрдлреНрдиреЛ рд╣рд╛рддрд▓реЗ рдЫреБрдиреБрд╣реЛрд╕реН:
MySQL рд░ Grafana рдХреЛ рд╕рд╛рде рдПрдХ рдбрдХрд░ рдЫрд╡рд┐ рд╣реЛ рдЬреБрди рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ рдХрдореНрдкреНрдпреБрдЯрд░рдорд╛ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдбрд╛рдЯрд╛рдмреЗрд╕рд▓реЗ рдЬрдирд╡рд░реА 2018 рджреЗрдЦрд┐ рдЬреБрд▓рд╛рдИ 2019 рд╕рдореНрдо рдбреЗрдореЛ рд╡рд░реНрд╖рдХреЛ рдбреЗрдореЛ рдбреЗрдЯрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпреЛ рдЫрд╡рд┐рдорд╛ рддрдкрд╛рдЗрдБрдХреЛ рдбрд╛рдЯрд╛ рд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
SQL рдорд╛ рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдмрд╛рд░реЗрдорд╛ PS рд▓реЗрдЦрд╣рд░реВ:
рд╕реНрд░реЛрдд: www.habr.com
