Grafana рдорд╛ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ [+ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде рдбрдХрд░ рдЫрд╡рд┐]

Grafana рдорд╛ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ [+ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде рдбрдХрд░ рдЫрд╡рд┐]

рд╣рд╛рдореАрд▓реЗ Grafana рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░реЛрдореЛрдкрд▓реНрдЯ рд╕реЗрд╡рд╛рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рдореВрд╣рдХреЛ рджреГрд╢реНрдпрд╛рд╡рд▓реЛрдХрди рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рд▓рд╛рдИ рдХрд╕рд░реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВред

рдкреНрд░рд╡рд░реНрджреНрдзрди - рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд╕рд╛рде рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реЗрд╡рд╛ред рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ резреж рд╡рд░реНрд╖рдорд╛, рдкреНрд░рдгрд╛рд▓реАрдорд╛ рджрд░реНрддрд╛рдХреЛ рд╕рдВрдЦреНрдпрд╛ резреж рд▓рд╛рдЦ рдирд╛рдШреЗрдХреЛ рдЫред рд╕рдорд╛рди рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреЗрд╣рд░реВрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдпреЛ рдПрд░реНрд░реЗ рдПрдХрд░реВрдкрддрд╛рдмрд╛рдЯ рдЯрд╛рдврд╛ рдЫред

рдХрд╕реИрд▓реЗ рд╕рд╛рдЗрди рдЕрдк рдЧрд░реНрдпреЛ рд░ рд╕рджрд╛рдХреЛ рд▓рд╛рдЧрд┐ "рдирд┐рджрд╛рдпреЛ"ред рдХрд╕реИрд▓реЗ рдЖрдлреНрдиреЛ рдкрд╛рд╕рд╡рд░реНрдб рдмрд┐рд░реНрд╕реНрдпреЛ рд░ рдЫ рдорд╣рд┐рдирд╛рдХреЛ рдЕрд╡рдзрд┐рдорд╛ рджреБрдИ рдкрдЯрдХ рдердк рджрд░реНрддрд╛ рдЧрд░реНрдпреЛред рдХрд╕реИрд▓реЗ рдирдЧрдж рджрд░реНрддрд╛рдорд╛ рдкреИрд╕рд╛ рд▓реНрдпрд╛рдЙрдБрдЫ, рд░ рдХреЛрд╣реА рд╕рд┐рддреНрддреИрдорд╛ рдЖрдпреЛ рдЙрдкрдХрд░рдгред рд░ рд╕рдмреИрдмрд╛рдЯ рдХреЗрд╣реА рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫред

рд╣рд╛рдореНрд░реЛ рдЬрд╕реНрддреЛ рдареВрд▓рд╛ рдбрд╛рдЯрд╛ рд╕реЗрдЯрд╣рд░реВрдорд╛, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд░ рд╕реВрдХреНрд╖реНрдо рдирд┐рд░реНрдгрдпрд╣рд░реВ рдЧрд░реНрдиреБ рд╡реНрдпрд░реНрде рдЫред рддрд░ рдкреНрд░рд╡реГрддреНрддрд┐рд╣рд░реВ рд╕рдорд╛рддреНрди рд░ рдареВрд▓рд╛ рд╕рдореВрд╣рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдореНрднрд╡ рд░ рдЖрд╡рд╢реНрдпрдХ рдЫред рдЬреБрди рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рдЧрд░реНрдЫреМрдВред

рд╕рд╛рд░рд╛рдВрд╢

  1. рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╣реЛ рд░ рдпреЛ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ?
  2. SQL рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рджрд░реНрддрд╛рдХреЛ рдорд╣рд┐рдирд╛рдорд╛ рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗред
  3. рдХреЛрд╣реЛрд░реНрдЯрд╣рд░реВрд▓рд╛рдИ рдХрд╕рд░реА рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рдЧреНрд░рд╛рдлрд╛рдирд╛.

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╣реЛ рд░ рдпрд╕рд▓рд╛рдИ 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 рдорд╛ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ [+ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде рдбрдХрд░ рдЫрд╡рд┐]

рдЖрдлреНрдиреЛ рд╣рд╛рддрд▓реЗ рдЫреБрдиреБрд╣реЛрд╕реН:

рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде GitHub рднрдгреНрдбрд╛рд░ MySQL рд░ Grafana рдХреЛ рд╕рд╛рде рдПрдХ рдбрдХрд░ рдЫрд╡рд┐ рд╣реЛ рдЬреБрди рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ рдХрдореНрдкреНрдпреБрдЯрд░рдорд╛ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдбрд╛рдЯрд╛рдмреЗрд╕рд▓реЗ рдЬрдирд╡рд░реА 2018 рджреЗрдЦрд┐ рдЬреБрд▓рд╛рдИ 2019 рд╕рдореНрдо рдбреЗрдореЛ рд╡рд░реНрд╖рдХреЛ рдбреЗрдореЛ рдбреЗрдЯрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпреЛ рдЫрд╡рд┐рдорд╛ рддрдкрд╛рдЗрдБрдХреЛ рдбрд╛рдЯрд╛ рд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

SQL рдорд╛ рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдмрд╛рд░реЗрдорд╛ PS рд▓реЗрдЦрд╣рд░реВ:

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

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

рд╕реНрд░реЛрдд: www.habr.com

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рднрдПрдХрд╛ рд╕рд╛рдЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрд░рдкрд░реНрджреЛ рд╣реЛрд╕реНрдЯрд┐рдЩ рдЦрд░рд┐рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН ЁЯФе DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рднрд░рдкрд░реНрджреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдЩ рдХрд┐рдиреНрдиреБрд╣реЛрд╕реН | ProHoster