рдЧреНрд░реЗрдлрд╝рд╛рдирд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ [рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде + docker рдЫрд╡рд┐]

рдЧреНрд░реЗрдлрд╝рд╛рдирд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ [рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде + docker рдЫрд╡рд┐]

рд╣рдордиреЗ рдХреИрд╕реЗ рдЧреНрд░реЛрдкрд╛рдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдореЛрдкрд▓реНрдЯ рд╕реЗрд╡рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╣рд╡рд╛рд╕ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред


Promopult рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реЗрд╡рд╛ рд╣реИред рдСрдкрд░реЗрд╢рди рдХреЗ 10 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИред рдЬреЛ рд▓реЛрдЧ рд╕рдорд╛рди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдЖрдП рд╣реИрдВ рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдпрд╣ рд╕рд░рдгреА рд╕рдЬрд╛рддреАрдп рд╕реЗ рджреВрд░ рд╣реИред


рдХрд┐рд╕реА рдиреЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдФрд░ "рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕реЛ рдЧрдпрд╛"ред рдХрд┐рд╕реА рдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рднреВрд▓ рдЧрдП рдФрд░ рдЫрд╣ рдорд╣реАрдиреЗ рдореЗрдВ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ред рдХреЛрдИ рдХреИрд╢рд┐рдпрд░ рдХреЗ рд▓рд┐рдП рдкреИрд╕рд╛ рд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдореБрдлреНрдд рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реИред рдФрд░ рд╕рднреА рд╕реЗ рдХреБрдЫ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред


рд╣рдорд╛рд░реЗ рдЬреИрд╕реЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░, рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рд╕реВрдХреНрд╖реНрдо рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд░реБрдЭрд╛рдиреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдФрд░ рдмрдбрд╝реЗ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


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


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

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ SQL рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред


1. рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ


рдХреЛрд╣реЛрд░реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдореВрд╣реЛрдВ (рдХреЙрд╣реЛрд░реНрдЯреНрд╕) рдХреА рддреБрд▓рдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдЕрдХреНрд╕рд░, рд╣рдорд╛рд░реЗ рд╕рдореВрд╣ рд╕рдкреНрддрд╛рд╣ рдпрд╛ рдорд╣реАрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рдЧрдгрдирд╛ рдпрд╣рд╛рдВ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдордЭреЗрдВ:


  • рдЪреИрдирд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЬреАрд╡рди рдкрд░ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ;
  • рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ;
  • рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХреНрд╕ рдХреЗ рд▓реЙрдиреНрдЪ рдиреЗ рдЬреАрд╡рди рдХрд╛рд▓ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред

2. рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рд╕рд╣рд╡рд╛рд╕ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рд▓реЗрдЦ рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдЕрдкрдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ - рдкрд░реАрдХреНрд╖рдг рдбрдВрдк рдореЗрдВ, рдбреЗрдврд╝ рд╕рд╛рд▓ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рд╣реИрдВ: 1200 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ 53,000 рд▓реЗрдирджреЗрдиред рддрд╛рдХрд┐ рдЖрдк рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХреЗрдВ, рд╣рдордиреЗ MySQL рдФрд░ Grafana рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХ рдЗрдореЗрдЬ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЗрд╕реЗ рдЦреБрдж рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ GitHub рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред


рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред


рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдкреИрд╕рд╛ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВред рд╕рдордп рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рддрдиреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рд╕реЗрд╡рд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ 1 рдФрд░ 2 рдорд╣реАрдиреЗ рдмрд╛рдж рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред


рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдорд╣реАрдиреЗ рддрдХ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдорд╣реАрдиреЗ рдХреЗ рдЦрд░реНрдЪреЛрдВ рд╕реЗ рдорд╛рдкрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓рд╛рдЧрддреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдЖрджреЗрд╢, рдПрдХ рдорд╛рд╕рд┐рдХ рд╢реБрд▓реНрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдордпрдмрджреНрдз рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред


рд╕реНрд░реЛрдд рдбреЗрдЯрд╛


рдЙрджрд╛рд╣рд░рдг MySQL рдореЗрдВ рдмрдиреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдХреА DBMS рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛:


userIdRegistrationDate
12019/01/01
22019/01/02
32019/02/10
42019/01/03

рд╡реНрдпрдп рддрд╛рд▓рд┐рдХрд╛ - рдмрд┐рд▓рд┐рдВрдЧ:


userIdрддрд┐рдерд┐рдпреЛрдЧ
12019/01/0211
12019/02/2211
22019/02/1212
32019/02/1113
32019/03/1113
42019/01/0314
42019/02/0314

рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢реБрд▓реНрдХ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рддрд┐рдерд┐ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ:


SELECT b.userId, b.Date, u.RegistrationDate FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId 

рдкрд░рд┐рдгрд╛рдо:


userIdрддрд┐рдерд┐RegistrationDate
12019/01/022019/01/02
12019/02/222019/01/02
22019/02/122019/01/02
32019/02/112019/02/10
32019/03/112019/02/10
42019/01/032019/01/03
42019/02/032019/01/03

рд╣рдо рдорд╣реАрдиреЛрдВ рддрдХ рд╕рд╣рд╡рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рднреА рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ:


 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 

userIdBillingMonthRegistrationDateMonthsDiff
12019-012019-010
12019-022019-011
22019-022019-020
32019-022019-020
32019-032019-021
42019-032019-030
42019-032019-030

рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдорд╣реАрдиреЗ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧрд┐рдирддреЗ рд╣реИрдВ - рд╣рдо рдмрд┐рд▓рд┐рдВрдЧрдорд╛рд░реНрдЯ, рдкрдВрдЬреАрдХрд░рдгрдорд╛рд░реНрдЯ рдФрд░ рдордВрдерд┐рдл рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ:


 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 

рдкрд░рд┐рдгрд╛рдо:


UsersCountBillingMonthRegistrationMonthMonthsDiff
12019-012019-010
12019-022019-011
22019-022019-020
12019-032019-021
12019-032019-030

рдЬрдирд╡рд░реА, рдлрд░рд╡рд░реА рдФрд░ рдорд╛рд░реНрдЪ рдореЗрдВ, рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ - MonthDiff = 0. рдПрдХ рдЬрдирд╡рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдХреНрд░рд┐рдп рдерд╛ рдФрд░ рдлрд░рд╡рд░реА рдореЗрдВ RegistrationMonth = 2019-01, BillingMonth = 2019-02, рдФрд░ рдПрдХ рдлрд░рд╡рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рд░реНрдЪ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдерд╛ред


рдПрдХ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░, рдкреИрдЯрд░реНрди рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред


рдХреЛрдлрд╝реЛрд░реНрдЯреНрд╕ рдХреЛ рдЧреНрд░реЗрдлрд╝рд╛рдирд╛ рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ


рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдб рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдВрджрд░ рдЯреЗрдмрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ!


рдЧреЛрд░рдлрд╛рдирд╛ рдореЗрдВ рд╕рд╣рдЧрд╛рдореА рдХреЛ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдХреНрд╡реЗрд░реА рдЬреЛрдбрд╝реЗрдВ:


 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 рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред


рдбреЗрдореЛ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд░реНрдЯ:


рдЧреНрд░реЗрдлрд╝рд╛рдирд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдП [+ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдбреЙрдХрдЯрд░ рдЫрд╡рд┐]


рдпрд╣ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВ:


GitHub рдЙрджрд╛рд╣рд░рдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА MySQL рдФрд░ Grafana рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдирд╡рд░реА 2018 рд╕реЗ рдЬреБрд▓рд╛рдИ 2019 рддрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдврд╝ рд╕рд╛рд▓ рдХрд╛ рдбреЗрдореЛ рдбреЗрдЯрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕ рдЫрд╡рд┐ рдкрд░ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреБрдирд╢реНрдЪ рд▓реЗрдЦ SQL рдореЗрдВ cohort рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:


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


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

Source: https://habr.com/ru/post/hi464511/


All Articles