рд╕рдВрдЪрдпреА (рд╕рдВрдЪрдпреА) рдкрд░рд┐рдгрд╛рдо рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ SQL рдХреЙрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рднреА, рдпрд╣ рдПрдХ рдмрд┐рдЬреВрдХрд╛ рд╣реИ (рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП)ред рдЖрдЬ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ 10 рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ - рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд▓реЗрдХрд░ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдХ рддрдХред
рдПрдХреНрд╕реЗрд▓ рдЬреИрд╕реЗ рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ рдореЗрдВ, рдЪрд▓ рд░рд╣реЗ рдХреБрд▓ рдХреА рдЧрдгрдирд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ: рдкрд╣рд▓реЗ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:

... рдФрд░ рдлрд┐рд░ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдФрд░ рдкрд┐рдЫрд▓реЗ рдХреБрд▓ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ
... рдпрд╛:
рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╕рдореВрд╣реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛рд░реНрдп рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдЬрдЯрд┐рд▓ рдХрд░рддреА рд╣реИ: рдЕрдм рд╣рдо рдХрдИ рдкрд░рд┐рдгрд╛рдо (рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ) рдЧрд┐рдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рд╕рддрд╣ рдкрд░ рд╣реИ: рд╣рд░ рдмрд╛рд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд░рд┐рдХреЙрд░реНрдб рдХрд┐рд╕ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЦреАрдВрдЪреЗрдВ , рдФрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЪрдпреА рдХреБрд▓ рдХреА рдЧрдгрдирд╛ рджреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдШрдЯрдХреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ:
(a) рдбреЗрдЯ рдФрд░ рдбреЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреЗрдЯрд╛ рдЫрд╛рдВрдЯрдирд╛
(b) рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдЬрд┐рдХреНрд░ рд╣реИред
рд▓реЗрдХрд┐рди рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрдпрд╛ рд╣реИ? рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдереАред рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг - рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди - рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗрд╡рд▓
SQL: 2003 рдорд╛рдирдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрд░реЗрдХрд▓ (рд╕рдВрд╕реНрдХрд░рдг 8i) рдореЗрдВ рдереЗред рд▓реЗрдХрд┐рди рдЕрдиреНрдп DBMS рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ 5-10 рд╕рд╛рд▓ рдХреА рджреЗрд░реА рд╣реБрдИ: SQL Server 2012, MySQL 8.0.2 (2018), MariaDB 10.2.0 (2017), PostgreSQL 8.4 (2009), z / OS рдХреЗ рд▓рд┐рдП DB2 9 (2007) рд╡рд░реНрд╖), рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ SQLite 3.25 (2018)ред
рдбреЗрдЯрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ 1. рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рд░реНрдп
рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдЖрдзрд╛рд░ рдорд╛рдорд▓реЗ рдореЗрдВ (рд╕рдореВрд╣реЛрдВ рдХреЗ рдмрд┐рдирд╛ рддрд╛рд▓рд┐рдХрд╛) рд╣рдо рддрд╛рд░реАрдЦ рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
order by dt
... рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рд╕реЗ рдкрд╣рд▓реЗ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
rows between unbounded preceding and current row
рдЕрдВрддрддрдГ, рд╣рдореЗрдВ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
sum(val) over (order by dt rows between unbounded preceding and current row)
рдПрдХ рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
select s.*, coalesce(sum(s.val) over (order by s.dt rows between unbounded preceding and current row), 0) as total from test_simple s order by s.dt;
рд╕рдореВрд╣реЛрдВ (
grp
рдХреНрд╖реЗрддреНрд░) рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрдпреА рдХреБрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рдВрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рд╣рдо рд╕рдореВрд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ "рд╡рд┐рдВрдбреЛ" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдорд╛рдирддреЗ рд╣реИрдВ:

рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреАрд╡рд░реНрдб
partition by
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
partition by grp
рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЗрди рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
sum(val) over (partition by grp order by dt rows between unbounded preceding and current row)
рдлрд┐рд░ рдкреВрд░реА рдХреНрд╡реЗрд░реА рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
select tg.*, coalesce(sum(tg.val) over (partition by tg.grp order by tg.dt rows between unbounded preceding and current row), 0) as total from test_groups tg order by tg.grp, tg.dt;
рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЖрдкрдХреЗ DBMS (рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг!), рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, DBMS рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ (рдЬреЛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ Microsoft Access рдФрд░ SAP / Sybase ASE рдЬреИрд╕реЗ DBMS рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдПрдХ рд╡рд┐рдХреНрд░реЗрддрд╛-рд╕реНрд╡рддрдВрддреНрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
2. рдЙрдкрд╢рдо
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЦреНрдп DBMS рдореЗрдВ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗред рдпрд╣ рджреЗрд░реА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рд╕рдВрдмрдВрдзрдкрд░рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, рдбреЗрдЯрд╛ рдХрд╛ рдЖрджреЗрд╢ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдмрдВрдзрдкрд░рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рднрд╛рд╡рдирд╛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдПрдХ рдЙрдкрд╢рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрдкрд╢рдо рдХреЛ рд╡рд░реНрддрдорд╛рди (рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рд╣рд┐рдд) рд╕реЗ рдкрд╣рд▓реЗ рдХреА рддрд╛рд░реАрдЦ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЗ рдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
ред
рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рдХреНрдпрд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
select s.*, (select coalesce(sum(t2.val), 0) from test_simple t2 where t2.dt <= s.dt) as total from test_simple s order by s.dt;
рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЙрдк-рдзрд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рддрдХ рдХреБрд▓ рдорд╛рдирддреА рд╣реИ (рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ), рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдорд╛рди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
select s.*, s.val + (select coalesce(sum(t2.val), 0) from test_simple t2 where t2.dt < s.dt) as total from test_simple s order by s.dt;
рдХрдИ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрдпреА рдкрд░рд┐рдгрд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдЙрдк-рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
select g.*, (select coalesce(sum(t2.val), 0) as total from test_groups t2 where g.grp = t2.grp and t2.dt <= g.dt) as total from test_groups g order by g.grp, g.dt;
рд╕реНрдерд┐рддрд┐
g.grp = t2.grp
рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡рд┐рдВрдбреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ
partition by grp
рдХреЗ рдХрд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ)ред
3. рдЖрдВрддрд░рд┐рдХ рд╕рдВрдмрдВрдз
рдЪреВрдВрдХрд┐ рдЙрдкрд╢реНрд░реЗрдгрд┐рдпрд╛рдБ рдФрд░ рдЬреЛрдбрд╝ рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рд╕реЗрд▓реНрдл рдЬреЙрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
select s.*, coalesce(sum(t2.val), 0) as total from test_simple s inner join test_simple t2 on t2.dt <= s.dt group by s.dt, s.val order by s.dt;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, subquery
t2.dt <= s.dt
рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдПрдХ
t2.dt <= s.dt
рд╕реНрдерд┐рддрд┐ рдмрди рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдЧреНрд░рд┐рдЧреЗрдЯрд┐рдВрдЧ рдлрдВрдХреНрд╢рди
sum()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
sum()
рд╣рдореЗрдВ
group by s.dt, s.val
рджреНрд╡рд╛рд░рд╛
group by s.dt, s.val
рджрд┐рдирд╛рдВрдХ рдФрд░ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ
grp
рд╕рдореВрд╣реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
select g.*, coalesce(sum(t2.val), 0) as total from test_groups g inner join test_groups t2 on g.grp = t2.grp and t2.dt <= g.dt group by g.grp, g.dt, g.val order by g.grp, g.dt;
4. рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдЙрддреНрдкрд╛рдж
рдЬрдм рд╕реЗ рд╣рдордиреЗ рдЙрдкрдХреБрдВрдЬреА рдХреЛ рдЬреНрд╡рд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдЙрддреНрдкрд╛рдж рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЖрдЬрд╝рдорд╛рдПрдВ? рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рд╕рдВрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
select s.*, coalesce(sum(t2.val), 0) as total from test_simple s, test_simple t2 where t2.dt <= s.dt group by s.dt, s.val order by s.dt;
рдпрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП:
select g.*, coalesce(sum(t2.val), 0) as total from test_groups g, test_groups t2 where g.grp = t2.grp and t2.dt <= g.dt group by g.grp, g.dt, g.val order by g.grp, g.dt;
рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╛рдзрд╛рди (рд╕рдмрдХреНрд╡реЗрд░реА, рдЗрдирд░ рдЬреЙрдЗрди, рдХрд╛рд░рдЯреЗрд╕рд┐рдпрди рдЬреЙрдЗрди)
SQL-92 рдФрд░
SQL: 1999 рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА DBMS рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЗрди рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдХрдо рдкреНрд░рджрд░реНрд╢рди рд╣реИред рдпрд╣ рдПрдХ рдмрдбрд╝реА рдореБрд╕реАрдмрдд рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдЕрдзрд┐рдХ рдЧрддрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ!)ред рдЖрдЧреЗ рдХреЗ рддрд░реАрдХреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИрдВ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреАрдмреАрдПрдордПрд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдФрд░ рдЙрдирдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ, рддрд╛рд▓рд┐рдХрд╛ рдЖрдХрд╛рд░, рдЕрдиреБрдХреНрд░рдорд┐рдд)ред
5. рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЕрдиреБрд░реЛрдз
рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд╛рд▓рд┐рдХрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╢реНрди рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ "рдПрдВрдХрд░" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдХреНрд╡реЗрд░реА рдЬреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд▓рд╛рдЗрди рд▓реМрдЯрд╛рддреА рд╣реИ:
select dt, val, val as total from test_simple where dt = (select min(dt) from test_simple)
рдлрд┐рд░,
union all
рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо "рд▓рдВрдЧрд░" рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рджрд┐рдирд╛рдВрдХ рджрд┐рдирд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рджрд┐рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
select r.dt, r.val, cte.total + r.val from cte inner join test_simple r on r.dt = dateadd(day, 1, cte.dt)
рдПрдХ рджрд┐рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SQL рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдпрд╣
r.dt = dateadd(day, 1, cte.dt)
, Oracle рдХреЗ рд▓рд┐рдП
r.dt = cte.dt + 1
рд╣реИ, рдЖрджрд┐ред
"рд▓рдВрдЧрд░" рдФрд░ рдореБрдЦреНрдп рдЕрдиреБрд░реЛрдз рдХреЛ рдорд┐рд▓рд╛рдХрд░, рд╣рдо рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
with cte (dt, val, total) as (select dt, val, val as total from test_simple where dt = (select min(dt) from test_simple) union all select r.dt, r.val, cte.total + r.val from cte inner join test_simple r on r.dt = dateadd(day, 1, cte.dt)
рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛:
with cte (dt, grp, val, total) as (select g.dt, g.grp, g.val, g.val as total from test_groups g where g.dt = (select min(dt) from test_groups where grp = g.grp) union all select r.dt, r.grp, r.val, cte.total + r.val from cte inner join test_groups r on r.dt = dateadd(day, 1, cte.dt)
6. рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреНрд╡реЗрд░реА row_number()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде
рдкрд┐рдЫрд▓рд╛ рдирд┐рд░реНрдгрдп 1 рджрд┐рди рдХреА рдХреНрд░рдорд┐рдХ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рджрд┐рдирд╛рдВрдХ рджрд┐рдирд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред рд╣рдо
row_number()
рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рд╕реЗ
row_number()
рд╣реИрдВ, рдЬреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдЕрдиреБрдЪрд┐рдд рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдорд╛рдзрд╛рди
рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛
рдкреНрд░рдорд╛рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдЗрди рдирдВрдмрд░ (рд░рд┐рдХреЙрд░реНрдб рдЖрдИрдбреА) рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, SQL рд╕рд░реНрд╡рд░ рдореЗрдВ,
row_number()
рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рд╕реЗ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛ (
sum()
рд╕рд╣рд┐рдд)ред
рдЗрд╕рд▓рд┐рдП,
row_number()
рд╕рд╛рде рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рджреЛ
row_number()
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рд░реЗрдЦрд╛рдПрдБ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
with cte1 (dt, val, rn) as (select dt, val, row_number() over (order by dt) as rn from test_simple)
... рдФрд░ рдпрджрд┐ рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
cte1
рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
cte2 (dt, val, rn, total) as (select dt, val, rn, val as total from cte1 where rn = 1 union all select cte1.dt, cte1.val, cte1.rn, cte2.total + cte1.val from cte2 inner join cte1 on cte1.rn = cte2.rn + 1 )
рдФрд░ рдкреВрд░рд╛ рдЕрдиреБрд░реЛрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
with cte1 (dt, val, rn) as (select dt, val, row_number() over (order by dt) as rn from test_simple), cte2 (dt, val, rn, total) as (select dt, val, rn, val as total from cte1 where rn = 1 union all select cte1.dt, cte1.val, cte1.rn, cte2.total + cte1.val from cte2 inner join cte1 on cte1.rn = cte2.rn + 1 ) select dt, val, total from cte2 order by dt;
... рдпрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП:
with cte1 (dt, grp, val, rn) as (select dt, grp, val, row_number() over (partition by grp order by dt) as rn from test_groups), cte2 (dt, grp, val, rn, total) as (select dt, grp, val, rn, val as total from cte1 where rn = 1 union all select cte1.dt, cte1.grp, cte1.val, cte1.rn, cte2.total + cte1.val from cte2 inner join cte1 on cte1.grp = cte2.grp and cte1.rn = cte2.rn + 1 ) select dt, grp, val, total from cte2 order by grp, dt;
7. CROSS APPLY
/ LATERAL
рдЪрд▓ рд░рд╣реЗ рдХреБрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд╡рд┐рджреЗрд╢реА рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ
CROSS APPLY
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ (SQL Server, Oracle) рдпрд╛ рдЗрд╕рдХреЗ рд╕рдордХрдХреНрд╖
LATERAL
(MySQL, PostgreSQL) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпреЗ рдСрдкрд░реЗрдЯрд░ рджреЗрд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ Oracle рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг 12c рд╕реЗ)ред рдФрд░ рдХреБрдЫ DBMSs (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
MariaDB ) рдореЗрдВ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрдгрдп рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реМрдВрджрд░реНрдп рдХреЗ рд╣рд┐рдд рдореЗрдВ рд╣реИред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ,
CROSS APPLY
рдпрд╛
LATERAL
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
LATERAL
рд╕рдорд╛рди рд╣реИ: рд╣рдо рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдореБрдЦреНрдп рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ:
cross apply (select coalesce(sum(t2.val), 0) as total from test_simple t2 where t2.dt <= s.dt ) t2
... рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
select s.*, t2.total from test_simple s cross apply (select coalesce(sum(t2.val), 0) as total from test_simple t2 where t2.dt <= s.dt ) t2 order by s.dt;
рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рд╕рдорд╛рди рд╣реЛрдЧрд╛:
select g.*, t2.total from test_groups g cross apply (select coalesce(sum(t2.val), 0) as total from test_groups t2 where g.grp = t2.grp and t2.dt <= g.dt ) t2 order by g.grp, g.dt;
рдХреБрд▓: рд╣рдордиреЗ рдореБрдЦреНрдп рдордВрдЪ-рд╕реНрд╡рддрдВрддреНрд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ DBMS рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ! рдЪреВрдВрдХрд┐ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЖрдЗрдП рд╣рдо рдХреБрдЫ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЛрдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
8. MODEL
рдмрдпрд╛рди (рдУрд░реЗрдХрд▓)
рдУрд░реЗрдХрд▓ рдореЗрдВ
MODEL
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕рдмрд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдордиреЗ рд╕рдВрдЪрдпреА рдХреБрд▓ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХреА:
MODEL
рдЖрдкрдХреЛ рдЗрд╕ рд╕реВрддреНрд░ рдХреЛ рдПрдХ рд╕реЗ рдПрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ! рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ
total
рдкрдВрдХреНрддрд┐ рдХреЛ рд╡рд░реНрддрдорд╛рди рдкрдВрдХреНрддрд┐ рдХреЗ рдорд╛рдиреЛрдВ рд╕реЗ рднрд░рддреЗ рд╣реИрдВ
select dt, val, val as total from test_simple
... рдлрд┐рд░ рд╣рдо рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЛ
row_number() over (order by dt) as rn
(рдпрд╛ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ:
total[rn >= 2] = total[cv() - 1] + val[cv()]
ред
рдпрд╣рд╛рдБ
cv()
рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рд▓рд╛рдЗрди рдХреЗ рдорд╛рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдФрд░ рдкреВрд░рд╛ рдЕрдиреБрд░реЛрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
select dt, val, total from (select dt, val, val as total from test_simple) t model dimension by (row_number() over (order by dt) as rn) measures (dt, val, total) rules (total[rn >= 2] = total[cv() - 1] + val[cv()]) order by dt;
9. рдХрд░реНрд╕рд░ (рдПрд╕рдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░)
рдПрдХ рд░рдирд┐рдВрдЧ рдЯреЛрдЯрд▓ рдЙрди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд╣рд╛рдВ SQL рд╕рд░реНрд╡рд░ рдореЗрдВ рдХрд░реНрд╕рд░ рди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдмреЗрд╣рддрд░ рд╣реИ (рдХрдо рд╕реЗ рдХрдо 2012 рд╕рдВрд╕реНрдХрд░рдг рддрдХ, рдЬрд╣рд╛рдВ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рдИ рджрд┐рдП)ред
рдХрд░реНрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рддреБрдЪреНрдЫ рд╣реИред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рд╕реЗ рддрд╛рд░реАрдЦреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
create table
рдлрд┐рд░ рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрдЧрд╛:
declare @VarTotal int, @VarDT date, @VarVal int; set @VarTotal = 0;
рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдХрд░реНрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
declare cur cursor local static read_only forward_only for select dt, val from
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
select dt, val, total from
10. рд╕реНрдерд╛рдиреАрдп рдЪрд░ (SQL рд╕рд░реНрд╡рд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрджреНрдпрддрди рдХрд░реЗрдВ
SQL рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдЕрдиреИрдЪреНрдЫрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рдЪрд▓реЛ рджреЛ рдЪрд░ рдмрдирд╛рддреЗ рд╣реИрдВ: рдПрдХ рд╕рдВрдЪрдпреА рдпреЛрдЧ рдФрд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЪрд░ рдХреЗ рд▓рд┐рдП:
declare @VarTotal int = 0; declare @tv table (dt date null, val int null, total int null );
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЦреНрдп рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ
@tv
рднрд░реЗрдВ
insert @tv (dt, val, total) select dt, val, 0 as total from test_simple order by dt;
рддрдм
@tv
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдЪрд░
@tv
рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
update @tv set @VarTotal = total = @VarTotal + val from @tv;
... рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:
select * from @tv order by dt;
рд╕рд╛рд░рд╛рдВрд╢: рд╣рдордиреЗ SQL рдореЗрдВ рд╕рдВрдЪрдпреА рдпреЛрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖ 10 рддрд░реАрдХреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреАред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред