MySQL - рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЕрдХреНрд╕рд░ рд╡реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ MySQL рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ (рд╡рд┐рдВрдбреЛ) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред рдиреЛрдЯред рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдЕрднреА рднреА MySQL рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдХрд╛рджрдорд┐рдХ рд░реБрдЪрд┐ рд╣реИред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ MySQL рдореЗрдВ рдХреЛрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдХрд╛рд░реНрдп рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ MySQL рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ SQL рдХреНрд╡реЗрд░реА рдХреЗ рдЕрдВрджрд░ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп DBMS рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреВрдард╛, рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред рд╣рдо рдХреНрд╡реЗрд░реА рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЪрдпрди рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрд░реЛрдз рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреНрд░рдо рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЪрд░ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдХреНрд░рдо рдХрд╕реНрдЯрдо рдЫрдБрдЯрд╛рдИ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

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

рдкреБрдирд░рд╛рд╡рд░реНрддрди рдПрдирд╛рд▓реЙрдЧ


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

SELECT IF(X=1, Fn_1, Fn_2) F FROM( SELECT @I := @I + @J Fn_1, @J := @I + @J Fn_2 FROM (SELECT 0 dummy UNION ALL SELECT 0 UNION ALL SELECT 0)a, (SELECT 0 dummy UNION ALL SELECT 0 UNION ALL SELECT 0)b, (SELECT @I := 1, @J := 1)IJ )T, /* ,     1 */ (SELECT 1 X UNION ALL SELECT 2)X; 

рдпрд╣ рдХреНрд╡реЗрд░реА 18 рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рдкрд╣рд▓реЗ рджреЛ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ:

 2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765 

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

5) 6) рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ 9 рд░рд┐рдХреЙрд░реНрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред

рд▓рд╛рдЗрди 7 рдореЗрдВ) рд╣рдо рджреЛ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ @I, @J рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ 1 рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

рд▓рд╛рдЗрди 3 рдкрд░), рдирд┐рдореНрди рд╣реЛрддрд╛ рд╣реИ: рдкрд╣рд▓рд╛, рдЪрд░ @I рдХреЛ рджреЛ рдЪрд░ рдХрд╛ рдпреЛрдЧ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рддрдм рд╣рдо рд╡реИрд░рд┐рдПрдмрд▓ @J рдХреЛ рд╕рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ @I рдХрд╛ рдореВрд▓реНрдп рдкрд╣рд▓реЗ рд╣реА рдмрджрд▓ рдЪреБрдХрд╛ рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, SELECT рдореЗрдВ рдЧрдгрдирд╛ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИ - рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рднреА рджреЗрдЦреЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд░ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣рдорд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ 9 рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЪрд░ @I рдФрд░ @J рдореЗрдВ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред

рдЕрдиреНрдп DBMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╢реНрди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ !

рдиреЛрдЯ:
рдЪрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЙрдкрд╡рд░реНрдЧ (рд▓рд╛рдЗрди 7) рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рд╣рдо SELECT рдХреНрд▓реЙрдЬ рдореЗрдВ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗрд╡рд▓ 1 рдмрд╛рд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛)ред рдПрдХ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдореВрд▓реНрдп рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ NULL рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ BLOB рд╣реЛрдЧрд╛ред

рдХреНрд░рдо рдЬрд┐рд╕рдореЗрдВ SELECT рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╕реНрдЯрдо рдЫрдБрдЯрд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рджрд┐рдП рдЧрдП рдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

 SELECT val, @I:=@I+1 Num FROM (SELECT 30 val UNION ALL SELECT 20 UNION ALL SELECT 10 UNION ALL SELECT 50)a, (SELECT @I := 0)I ORDER BY val; 

 Val Num 10 1 20 2 30 3 50 4 

рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдирд╛рд▓реЙрдЧ


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TestTable рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБ:

 CREATE TABLE TestTable( group_id INT NOT NULL, order_id INT UNIQUE NOT NULL, value INT NOT NULL ); 

рдЬрд╣рд╛рдБ
group_id - рд╕рдореВрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдВрдбреЛ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ);
order_id - рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреВрдард╛ рдХреНрд╖реЗрддреНрд░;
рдореВрд▓реНрдп рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдореВрд▓реНрдп рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рднрд░реЗрдВ:

 INSERT TestTable(order_id, group_id, value) SELECT * FROM( SELECT 1 order_id, 1 group_id, 1 value UNION ALL SELECT 2, 1, 2 UNION ALL SELECT 3, 1, 2 UNION ALL SELECT 4, 2, 1 UNION ALL SELECT 5, 2, 2 UNION ALL SELECT 6, 2, 3 UNION ALL SELECT 7, 3, 1 UNION ALL SELECT 8, 3, 2 UNION ALL SELECT 9, 4, 1 UNION ALL SELECT 11, 3, 2 )T; 

рдХреБрдЫ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдЙрджрд╛рд╣рд░рдгред

1) ROW_NUMBER () OVER (ORDER BY order_id)


 SELECT T.*, @I:=@I+1 RowNum FROM TestTable T,(SELECT @I:=0)I ORDER BY order_id; 

group_id order_id value RowNum
1 1 1 1
1 2 2 2
1 3 2 3
2 4 1 4
2 5 2 5
2 6 3 6
3 7 1 7
3 8 2 8
4 9 1 9
3 11 2 10

2) ROW_NUMBER () OVER (рд╡рд┐рднрд╛рдЬрди group_id ORDER BY рдСрд░реНрдбрд░_рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛)


 SELECT group_id, order_id, value, RowNum FROM( SELECT T.*, IF(@last_group_id = group_id, @I:=@I+1, @I:=1) RowNum, @last_group_id := group_id FROM TestTable T,(SELECT @last_group_id:=NULL, @I:=0)I ORDER BY group_id, order_id )T; 

group_id order_id value RowNum
1 1 1 1
1 2 2 2
1 3 2 3
2 4 1 1
2 5 2 2
2 6 3 3
3 7 1 1
3 8 2 2
3 11 2 3
4 9 1 1

3) SUM (рдорд╛рди) OVER (рд╡рд┐рднрд╛рдЬрди group_id ORDER BY рдСрд░реНрдбрд░_рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛)


 SELECT group_id, order_id, value, RunningTotal FROM( SELECT T.*, IF(@last_group_id = group_id, @I:=@I+value, @I:=value) RunningTotal, @last_group_id := group_id FROM TestTable T, (SELECT @last_group_id:=NULL, @I:=0)I ORDER BY group_id, order_id )T; 

group_id order_id value RunningTotal
1 1 1 1
1 2 2 3
1 3 2 5
2 4 1 1
2 5 2 3
2 6 3 6
3 7 1 1
3 8 2 3
3 11 2 5
4 9 1 1

4) LAG (рдорд╛рди) OVER (рд╡рд┐рднрд╛рдЬрди group_id ORDER BY рдСрд░реНрдбрд░_рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛)


 SELECT group_id, order_id, value, LAG FROM( SELECT T.*, IF(@last_group_id = group_id, @last_value, NULL) LAG, @last_group_id := group_id, @last_value := value FROM TestTable T,(SELECT @last_value:=NULL, @last_group_id:=NULL)I ORDER BY group_id, order_id )T; 

group_id order_id value LAG
1 1 1 NULL
1 2 2 1
1 3 2 2
2 4 1 NULL
2 5 2 1
2 6 3 2
3 7 1 NULL
3 8 2 1
3 11 2 2
4 9 1 NULL

LEAD рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдПрдХ рдЬреИрд╕рд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдХреНрд░рдо-рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ ORDER рдХреЛ рдХреНрд░рдордмрджреНрдз рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрджреЗрд╢_D DESC

COUNT, MIN, MAX рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ рд╣рдо рд╕рдореВрд╣ (рд╡рд┐рдВрдбреЛ) рдореЗрдВ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рддрдм рддрдХ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗред рдПрдордПрд╕ рдПрд╕рдХреНрдпреВрдПрд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдВрдбреЛ "рд╕реНрдкреВрд▓" (рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рдмрдлрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рдВрдбреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдбрд╛рд▓рддрд╛ рд╣реИ), MySQL рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдкреВрд░реА рд╡рд┐рдВрдбреЛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж), рдФрд░ рдлрд┐рд░, рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реБрдП, рдкреВрд░реЗ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЧрдгрдирд╛ рдореВрд▓реНрдп рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рджреЛ рдЫрдВрдЯрдиреА рдЪрд╛рд╣рд┐рдПред рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдЫрдБрдЯрд╛рдИ рдЙрд╕реА рддрд░рд╣ рдмрдиреА рд░рд╣реЗ рдЬреИрд╕реЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб group_id ASC, order_id DESC, рдлрд┐рд░ рдлрд╝реАрд▓реНрдб group_id ASC, order_id ASC рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВред

5) COUNT (*) OVER (рд╡рд┐рднрд╛рдЬрди by group_id)


рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ, рд╣рдо рдмрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рджреЗрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо рд╡рд┐рдВрдбреЛ рдХреА рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧреАред

 SELECT group_id, order_id, value, Cnt FROM( SELECT group_id, order_id, value, IF(@last_group_id = group_id, @MaxRowNum, @MaxRowNum := RowNumDesc) Cnt, @last_group_id := group_id FROM( SELECT T.*, IF(@last_group_id = group_id, @I:=@I+1, @I:=1) RowNumDesc, @last_group_id := group_id FROM TestTable T,(SELECT @last_group_id:=NULL, @I:=0)I ORDER BY group_id, order_id DESC /* */ )T,(SELECT @last_group_id:=NULL, @MaxRowNum:=NULL)I ORDER BY group_id, order_id /* */ )T; 

group_id order_id value Cnt
1 1 1 3
1 2 2 3
1 3 2 3
2 4 1 3
2 5 2 3
2 6 3 3
3 7 1 3
3 8 2 3
3 11 2 3
4 9 1 1

рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ MAX рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:

6) MAX (рдорд╛рди) OVER (рд╡рд┐рднрд╛рдЬрди by group_id)


 SELECT group_id, order_id, value, MaxVal FROM( SELECT group_id, order_id, value, IF(@last_group_id = group_id, @MaxVal, @MaxVal := MaxVal) MaxVal, @last_group_id := group_id FROM( SELECT T.*, IF(@last_group_id = group_id, GREATEST(@MaxVal, value), @MaxVal:=value) MaxVal, @last_group_id := group_id FROM TestTable T,(SELECT @last_group_id:=NULL, @MaxVal:=NULL)I ORDER BY group_id, order_id DESC )T,(SELECT @last_group_id:=NULL, @MaxVal:=NULL)I ORDER BY group_id, order_id )T; 

group_id order_id value MaxVal
1 1 1 2
1 2 2 2
1 3 2 2
2 4 1 3
2 5 2 3
2 6 3 3
3 7 1 2
3 8 2 2
3 11 2 2
4 9 1 1

7) COUNT (DISTINCT рдореВрд▓реНрдп) OVER (рдкрд╛рд░реНрдЯреА рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рднрд╛рдЧ)


рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдЬреЛ рдПрдордПрд╕ SQL тАЛтАЛрд╕рд░реНрд╡рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЧрдгрдирд╛ рдЖрд░рдПрдХреЗ рд╕реЗ рдореИрдХреНрд╕ рд▓реЗрдиреЗ рдкрд░ рдПрдХ рдЙрдкрд╢рдо рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рдо рдпрд╣рд╛рдВ рднреА рд╡рд╣реА рдХрд░реЗрдВрдЧреЗред рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ, рд╣рдо RANK () OVER (PARTITION BY group_id ORDER BY value DESC) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдХреНрд░рдо рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдбрд╛рд▓рддреЗ рд╣реИрдВ:

 SELECT group_id, order_id, value, Cnt FROM( SELECT group_id, order_id, value, IF(@last_group_id = group_id, @Rank, @Rank := Rank) Cnt, @last_group_id := group_id FROM( SELECT T.*, IF(@last_group_id = group_id, IF(@last_value = value, @Rank, @Rank:=@Rank+1) , @Rank:=1) Rank, @last_group_id := group_id, @last_value := value FROM TestTable T,(SELECT @last_value:=NULL, @last_group_id:=NULL, @Rank:=0)I ORDER BY group_id, value DESC, order_id DESC )T,(SELECT @last_group_id:=NULL, @Rank:=NULL)I ORDER BY group_id, value, order_id )T; 

group_id order_id value Cnt
1 1 1 2
1 2 2 2
1 3 2 2
2 4 1 3
2 5 2 3
2 6 3 3
3 7 1 2
3 8 2 2
3 11 2 2
4 9 1 1

рдЙрддреНрдкрд╛рджрдХрддрд╛


рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрд╡-рдЬреБрдбрд╝рдиреЗ рдФрд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рдореЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред

1) рд╕реЗрд▓реНрдл-рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░реАрдХрд╛


 SELECT COUNT(*)N, T1.* FROM TestTable T1 JOIN TestTable T2 ON T1.order_id >= T2.order_id GROUP BY T1.order_id; 

рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 10000 рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЯреЗрд╕реНрдЯрдЯреЗрдмрд▓ рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИ:

рдЕрд╡рдзрд┐ / рд▓рд╛рдо
16.084 рд╕реЗрдХрдВрдб / 0.016 рд╕реЗрдХрдВрдб

2) рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:


 SELECT @N:=@N+1 N, T1.* FROM TestTable T1, (SELECT @N := 0)M ORDER BY T1.order_id; 

рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:

рдЕрд╡рдзрд┐ / рд▓рд╛рдо
0.016 рд╕реЗрдХрдВрдб / 0.015 рд╕реЗрдХрдВрдб

рдкрд░рд┐рдгрд╛рдо рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдЧрдгрдирд╛ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреА, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдЗрдП рдРрд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдкреНрд░рддреНрдпреЗрдХ Group_id рдорд╛рди рдХреЗ рд▓рд┐рдП TestTable рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкрд╣рд▓реЗ 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ, рдСрд░реНрдбрд░_рдб рджреНрд╡рд╛рд░рд╛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде DBMS рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 SELECT group_id, order_id, value FROM( SELECT *, ROW_NUMBER()OVER(PARTITION BY group_id ORDER BY order_id) RowNum FROM TestTable )T WHERE RowNum <= 2; 

рд╣рд╛рд▓рд╛рдБрдХрд┐, MySQL рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдЙрди рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рд░реЛрд╡рдирдо рдХреНрд╖реЗрддреНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реЗ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдирдВрдмрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЖрд╡рд╢реНрдпрдХ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 1 рдорд┐рд▓рд┐рдпрди рд░рд┐рдХреЙрд░реНрдб рдФрд░ 20 рдЕрджреНрд╡рд┐рддреАрдп group_id рдорд╛рди рд╣реИрдВред рдпрд╛рдиреА 40 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MySQL рдПрдХ рд▓рд╛рдЦ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП RowNum рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛! MySQL рдореЗрдВ рдПрдХрд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рдЕрджреНрд╡рд┐рддреАрдп group_id рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 SELECT DISTINCT group_id FROM TestTable; 

рдлрд┐рд░, рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдлреЙрд░реНрдо рдХреА рдПрдХ рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ:

 SELECT * FROM TestTable WHERE group_id=1 ORDER BY order_id LIMIT 2 UNION ALL SELECT * FROM TestTable WHERE group_id=2 ORDER BY order_id LIMIT 2 UNION ALL тАж SELECT * FROM TestTable WHERE group_id=20 ORDER BY order_id LIMIT 2; 

рдПрдХ рд▓рд╛рдЦ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд░реЛрд╡рдирдо рдХреА рдЧрдгрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 20 рдЖрд╕рд╛рди рдкреНрд░рд╢реНрди рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

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


All Articles