
рдХрд╕реНрдЯрдо рд╕рдореБрдЪреНрдЪрдп PostgreSQL рдХреА рдЙрди рдЕрдиреВрдареА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЛрдИ рднреА рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕реЗ рд╣реА рдЖрдк рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рдмрд╛рджрд▓ рдЦреБрд▓ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдиреБрднрд╡реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рд░рд╣рддреЗ рдереЗред рддреЛ рдЪрд▓рд┐рдП рдРрд╕реА рд╣реА simple unit рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ (рдмреБрд▓рд┐рдпрди) рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЬреНрдп, рдпрд╛рдиреА рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдХреМрди рдФрд░ рдХреНрдпреЛрдВ рдПрдХ рдЕрдЬреАрдм рдЪрд╛рд╣рддреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдареАрдХ рд╣реИ, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рджрд┐рди-рд░рд╛рдд рдЕрдкрдиреЗ рдХрдИ рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдШрдВрдЯреЗ рдХрд╛ рдЕрдкрдЯрд╛рдЗрдо рдЪрд┐рддреНрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рд░ 30 рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рд╣реИ:
TRUE - рд╕рд░реНрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ,
FALSE - рд╕рд░реНрд╡рд░ рдЭреВрда рдмреЛрд▓ рд░рд╣рд╛ рд╣реИред рдлрд┐рд░ рдпрджрд┐ рд╕рд░реНрд╡рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд╣рдо
TRUE рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдЦрдбрд╝рд╛ рдерд╛, рддреЛ рдХреНрд░рдорд╢рдГ
FALSE ред рдФрд░ рдпрджрд┐ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рдЭреВрда рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо
NULL рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред
рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреНрдп рддрдВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡рд┐рдиреНрдбреЛ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЖрдкрдХреЛ рдЕрдиреНрдп рд╕рдВрдЪрд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдпрд╛ рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрд╢рдиред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, PostgreSQL рдЖрдкрдХреЛ рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдЬрдорд╛ рдХрд░реЗрдЧрд╛ред рдЖрдорддреМрд░ рдкрд░, рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ:
- рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рд╕рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛);
- рд╕реНрддрдВрдн рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рди рд╣реЛрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП UP рдФрд░ DOWN рд░реАрдбрд┐рдВрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░, рд▓рдЧрднрдЧ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЕрдиреБрд╡рд╛рджрдХ ред рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╢реБрджреНрдз SQL рдореЗрдВ рднреА рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ:
CREATE OR REPLACE function mode_bool_state(int[], boolean) RETURNS int[] LANGUAGE sql as $body$ SELECT CASE $2 WHEN TRUE THEN array[ $1[1] + 1, $1[2] ] WHEN FALSE THEN array[ $1[1], $1[2] + 1 ] ELSE $1 END; $body$;
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ int [] рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реЛрд╕рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджрдХ редрдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:
CREATE OR REPLACE FUNCTION mode_bool_final(INT[]) RETURNS boolean LANGUAGE sql as $body$ SELECT CASE WHEN ( $1[1] = 0 AND $1[2] = 0 ) THEN NULL ELSE $1[1] >= $1[2] END; $body$;
рдмрд┐рдВрджреБ рдЫреЛрдЯрд╛ рд╣реИ - рдЗрдХрд╛рдИ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
CREATE AGGREGATE mode(boolean) ( SFUNC = mode_bool_state, STYPE = INT[], FINALFUNC = mode_bool_final, INITCOND = '{0,0}' );
рдпрд╣рд╛рдВ
SFUNC рдФрд░
FINALFUNC рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рд╣реИрдВ,
STYPE рдЖрдБрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ,
INITCOND рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЗрдВ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
SELECT server_name, sum(CASE WHEN server_up THEN 0.5 ELSE 0 END) as minutes_up, mode(server_up) as mode FROM servers WHERE montime BETWEEN '2013-04-01' and '2013-04-01 01:00:00';
server_name рдорд┐рдирдЯ_рдЕрдк рдореЛрдб
web1 56.5 TRUE
web2 0.0 FALSE
web3 48.0 TRUE
web4 11.5 FALSE
рдЯреЙрдо рдмреНрд░рд╛рдЙрди рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ PS
рдПрдХ рд▓реЗрдЦ рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рдПрдЧреНрд░реАрдЧреЗрдЯ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ, рд▓реЗрдЦрдХ рдЕрдВрддрд┐рдо рд╡реИрдХрд▓реНрдкрд┐рдХ
FINALFUNC рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
STYPE рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреБрд▓ рдЖрдзрд╛рд░ рдХрд╛ рдЖрдзрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИред