рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЙрд▓рдо рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рддрд╛рд▓рд┐рдХрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдмрд╕реЗрдЯ рдкрд░ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХрд╛ рд╕реЗрдЯ рдХреИрд╕реЗ рдЪреБрдирддреЗ рд╣реИрдВ - рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдХрд┐рддрд╛рдмреЗрдВ рдФрд░ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рддрд░реАрдХреЗ рд╕реЗ рдЪреБрдиреЗ рдЧрдП рд╣реИрдВ рдФрд░ рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ
рдХрд┐ рдХреИрд╕реЗ рддреЗрдЬреА рд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдП ред
рдпрд╣ рдкрд╣рд▓реА рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдВрддрд┐рдоред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрдердХ рд╣реИрдВ рдЬрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ (рд╡реНрдпрд╛рдЦреНрдпрд╛) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХрджрдо рд╕рд╣реА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдордЪреНрдЫрд░ рдирд╛рдХ рдХреЛ рдХрд▓рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдереЛрдбрд╝рд╛ рдФрд░ "рдирд┐рдЪреЛрдбрд╝" рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЙрд╕рдореЗрдВ 10 рдорд┐рд▓рд┐рдпрди рд░рд┐рдХреЙрд░реНрдб рд▓рд┐рдЦреЗрдВрдЧреЗ:
create table s ( d date, browser_id int not null, banner_id int not null, views bigint, clicks bigint, primary key(d, browser_id, banner_id) ); insert into s select d, browser_id, banner_id, succ + insucc, succ from ( select d, browser_id, banner_id, (array[0,0,50,500])[ceil(random()*4)] succ, (array[0,0,400,400000])[ceil(random()*4)] insucc from generate_series(now() - interval '99 day', now(), '1 day') d cross join generate_series(0, 999) banner_id cross join generate_series(0, 99) browser_id )_;
рджрд┐рдирд╛рдВрдХ, рдЖрдИрдбреА-рд╢рдиреАрдХреА рдФрд░ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗрд╡рд▓ рд╢рд╛рд▓реАрдирддрд╛ рдХреЗ рд▓рд┐рдП рджреА рдЧрдИ рд╣реИ - рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реЛрдЧрд╛, рд╕рдВрдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдХреНрд▓рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдЕрдЬреАрдм рдкреАрдврд╝реА рдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓реНрдп рдЕрдХреНрд╕рд░ рд╢реВрдиреНрдп рдФрд░ рдХрд╛рдлреА рдмрдбрд╝реЗ рджреЛрдиреЛрдВ рд╣реЛрддреЗ рд╣реИрдВред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдардВрдбреЗ рдХреИрд╢ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╣рд░ рд╕рдордп рдорд╛рдк рдХрд░реЗрдВрдЧреЗред
рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛, рдФрд╕рдд рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЧреЛрд▓ рдХрд┐рдпрд╛ред рдХрд╛рд░ рдХрдордЬреЛрд░ рд╣реИ, рдЖрдк рддреЗрдЬ рд╣реЛ рдЬрд╛рдПрдЧрд╛!
рд╡рд┐рдзрд┐ 1: рдорд╛рдереЗ
select sum(clicks) from s;
9 рд╕реЗрдХрдВрдб
рд╡рд┐рдзрд┐ 2: рдкреНрд░рдХрд╛рд░ рдмрджрд▓реЗрдВ
рд╣рдо рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрд╕реА рд╕рдордп рд╣рдо рдЯрд╛рдЗрдк рдиреНрдпреВрдореЗрд░рд┐рдХ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗ:
create table s ( d date, browser_id int not null, banner_id int not null, views numeric, clicks numeric, primary key(d, browser_id, banner_id) );
8 рд╕реЗрдХрдВрдб рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдЕрдзрд┐рдХ рд╕реБрд╕реНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝реЗ рдЖрдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдорд╢реАрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рддреЗрдЬреА рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ: рд░рд╛рд╢рд┐, рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рдЧрд┐рдВрдЯ рдпрд╛ рдиреНрдпреВрдореЗрд░рд┐рдХ рд▓реЗрдирд╛, рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЬрдм рд╣рдо рддреБрд░рдВрдд рдЗрдирдкреБрдЯ рдХреЛ рдиреНрдпреВрдореЗрд░рд┐рдХ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред
рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА: рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдВрддрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдФрд░ рдпрд╣ ~ 2 рдмрд┐рд▓рд┐рдпрди рддрдХ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ), рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рднреА рддреЗрдЬ рд╣реЛрдЧрд╛ред рд╕реБрдо рдлрд┐рд░ рд▓реМрдЯрддрд╛ рд╣реИред
рджреВрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА: рд╕рд╛рдзрд╛рд░рдг рдЕрдВрдХрдЧрдгрд┐рдд рд╕рдВрдЪрд╛рд▓рди (+, -, *, /) рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрд┐рдЧрд┐рди рдХреЗ рд╕рд╛рдеред рдФрд░ рдпреЛрдЧ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреЗ рд╕рд╛рде рддреЗрдЬ рд╣реИредрд╡рд┐рдзрд┐ 3: рд╢реВрдиреНрдп рдХреА рдЧрдгрдирд╛ рди рдХрд░реЗрдВ
select sum(clicks) from s where clicks <> 0;
рдпрд╣ рд╡рд┐рдзрд┐ 7 рд╕реЗрдХрдВрдб рддрдХ рддреНрд╡рд░рдг рджреЗрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдПрдХ рдЦрд╛рдореА рд╣реИ: рдЬрдм рдХрдИ рд╕реНрддрдВрднреЛрдВ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдХреЙрд▓рдо рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛред
рд╡рд┐рдзрд┐ 4: рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рдХреЛ рдмрджрд▓реЗрдВ
select sum(nullif(licks, 0)) from s;
рд╡рд╣реА 7 рд╕реЗрдХрдВрдб, рд▓реЗрдХрд┐рди рдХрдИ рдХреЙрд▓рдореЛрдВ рдХреЛ рд╕рдореЗрдЯрдиреЗ рдкрд░ рд╡рд┐рдзрд┐ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд░рд╛рд╢рд┐, рдПрдХ рд╕рдЦреНрдд (рд╕рдЦреНрдд) рдХреБрд▓ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдирд▓ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИред
рдЬрдм рдХреЙрд▓рдо рдореЗрдВ рд╢реВрдиреНрдп рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛ (рдХрдо рд╕реЗ рдХрдо 10%, рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рдЖрдзреА) рд╣реЛ рддреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ 3 рдФрд░ 4 рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВредрд╡рд┐рдзрд┐ 5: рд╢реВрдиреНрдп рдХреЛ рд╕реАрдзреЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рдмрджрд▓реЗрдВ
рдпрд╣ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдХреБрдЫ рд╣рдж рддрдХ "рдЕрдиреИрддрд┐рдХ" рд╣реИ: рд╣рдо рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рд░реМрдВрдж рджрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
create table s2 (like s including all); insert into s2 select d, browser_id, banner_id, nullif(views, 0), nullif(clicks, 0) from s;
select sum(clicks) from s2;
6 рд╕реЗрдХрдВрдб рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдмрд┐рдЯрдореИрдк рдореЗрдВ рджреБрдХрд╛рдиреЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯреНрдпреВрдкрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╢рд╛рдпрдж рдкрд╛рдардХ рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдЧрд╛: рд╣рдордиреЗ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╕рдордп рд╢реВрдиреНрдп рдХреЛ рдХреЙрд▓рдо рдХреЛ рддреБрд░рдВрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ?
рдФрд░ рд╣рдо рд╕рдордЭрд╛рдПрдВрдЧреЗ: рдЕрд╕рд▓реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХрдИ рд╕реНрддрдВрдн рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╢реВрдиреНрдп рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рд╣реИрдВред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдВрдХ:
- рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░
- рд╕рдо рдХреБрд▓ рд╕рдорд╛рд░реЛрд╣
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрд▓ рдХрд╛рд░реНрдп, рдХрдареЛрд░рддрд╛