Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π°Π²ΡΠΎΠ·Π°ΠΌΠ΅Π½Ρ null ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² postgresql
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π°Π²ΡΠΎΠ·Π°ΠΌΠ΅Π½Ρ null ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² postgresql
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΡΡΠΎΠΊ, ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ²ΠΎΠ΄Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π² Π Π°Π·Π΄Π΅Π»Π΅ 3.5, Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ·Π½Π°ΡΡ ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅ 4.2.8.
Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠΊΠΎΠ½Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (Π½ΠΎ Π½Π΅ ΡΠΎΡΡΠΈΡΡΡΡΠΈΠ΅ ΠΈ Π½Π΅ Π³ΠΈΠΏΠΎΡΠ΅Π·ΠΈΡΡΡΡΠΈΠ΅); ΡΠΏΠΈΡΠΎΠΊ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ Π² Π Π°Π·Π΄Π΅Π»Π΅ 9.21. ΠΠ³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Π½ΡΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π·Π° ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ OVER ; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ΄Π°ΡΡ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ Π½Π°Π±ΠΎΡΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ.
Π’Π°Π±Π»ΠΈΡΠ° 9.60. ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π² Π΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅, Π½Π°ΡΠΈΠ½Π°Ρ Ρ 1.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π½Π³ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ; ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΠΈ row_number Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π΅ΠΉ ΡΡΡΠΎΠΊΠΈ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π½Π³ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π±Π΅Π· ΠΏΡΠΎΠΏΡΡΠΊΠΎΠ²; ΠΏΠΎ ΡΡΡΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΈΡΠ°Π΅Ρ Π³ΡΡΠΏΠΏΡ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊ.
percent_rank () β double precision
cume_dist () β double precision
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΡΠΌΡΠ»ΡΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΡΠΎ Π΅ΡΡΡ (ΡΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ ΡΠ°Π·Π΄Π΅Π»Π°, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΈΠ»ΠΈ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠ΅) / (ΠΎΠ±ΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ ΡΠ°Π·Π΄Π΅Π»Π°). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π»Π΅ΠΆΠΈΡ Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π΅ ΠΎΡ 1/ N Π΄ΠΎ 1.
ntile ( num_buckets integer ) β integer
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ΅ ΠΎΡ 1 Π΄ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π΄Π»Ρ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»Π° Π½Π° ΡΠ°ΡΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π±Π»ΠΈΠ·ΠΊΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ².
first_value ( value anyelement ) β anyelement
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ( value ), Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°ΠΌΠΊΠ΅ ΠΎΠΊΠ½Π°.
last_value ( value anyelement ) β anyelement
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ( value ), Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°ΠΌΠΊΠ΅ ΠΎΠΊΠ½Π°.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π°Π²ΡΠΎΠ·Π°ΠΌΠ΅Π½Ρ null ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² postgresql
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΡΡΠΎΠΊ, ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ²ΠΎΠ΄Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π² Π Π°Π·Π΄Π΅Π»Π΅ 3.5, Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ·Π½Π°ΡΡ ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅ 4.2.8.
Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠΊΠΎΠ½Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (Π½ΠΎ Π½Π΅ ΡΠΎΡΡΠΈΡΡΡΡΠΈΠ΅ ΠΈ Π½Π΅ Π³ΠΈΠΏΠΎΡΠ΅Π·ΠΈΡΡΡΡΠΈΠ΅); ΡΠΏΠΈΡΠΎΠΊ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ Π² Π Π°Π·Π΄Π΅Π»Π΅ 9.21. ΠΠ³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Π½ΡΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π·Π° ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ OVER ; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ΄Π°ΡΡ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ Π½Π°Π±ΠΎΡΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ.
Π’Π°Π±Π»ΠΈΡΠ° 9.60. ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π² Π΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅, Π½Π°ΡΠΈΠ½Π°Ρ Ρ 1.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π½Π³ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ; ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΠΈ row_number Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π΅ΠΉ ΡΡΡΠΎΠΊΠΈ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π½Π³ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π±Π΅Π· ΠΏΡΠΎΠΏΡΡΠΊΠΎΠ²; ΠΏΠΎ ΡΡΡΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΈΡΠ°Π΅Ρ Π³ΡΡΠΏΠΏΡ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊ.
percent_rank () β double precision
cume_dist () β double precision
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΡΠΌΡΠ»ΡΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΡΠΎ Π΅ΡΡΡ (ΡΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ ΡΠ°Π·Π΄Π΅Π»Π°, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΈΠ»ΠΈ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠ΅) / (ΠΎΠ±ΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ ΡΠ°Π·Π΄Π΅Π»Π°). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π»Π΅ΠΆΠΈΡ Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π΅ ΠΎΡ 1/ N Π΄ΠΎ 1.
ntile ( num_buckets integer ) β integer
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ΅ ΠΎΡ 1 Π΄ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π΄Π»Ρ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»Π° Π½Π° ΡΠ°ΡΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π±Π»ΠΈΠ·ΠΊΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ².
first_value ( value anyelement ) β anyelement
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ( value ), Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°ΠΌΠΊΠ΅ ΠΎΠΊΠ½Π°.
last_value ( value anyelement ) β anyelement
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ( value ), Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°ΠΌΠΊΠ΅ ΠΎΠΊΠ½Π°.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
3.5. ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π΄Π»Ρ Π½Π°Π±ΠΎΡΠ° ΡΡΡΠΎΠΊ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΎΠΉ. ΠΠΎΠΆΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΡΡ Π΅Ρ Ρ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, Π½ΠΎ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠΉ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ Π½Π΅ Π³ΡΡΠΏΠΏΠΈΡΡΡΡΡΡ Π² ΠΎΠ΄Π½Ρ, Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ. ΠΠ½ΡΡΡΠΈ ΠΆΠ΅, ΠΎΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠ°ΠΊ ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠ½Π°Ρ, ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π·Π°ΠΏΡΠΎΡΠ°.
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΠΊΠ°ΠΊ ΡΡΠ°Π²Π½ΠΈΡΡ Π·Π°ΡΠΏΠ»Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ° ΡΠΎ ΡΡΠ΅Π΄Π½Π΅ΠΉ Π·Π°ΡΠΏΠ»Π°ΡΠΎΠΉ Π΅Π³ΠΎ ΠΎΡΠ΄Π΅Π»Π°:
ΠΡΠ·ΠΎΠ² ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ OVER, ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π·Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠ»ΠΈΡΠ°Π΅Ρ Π΅Ρ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ OVER ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΡΡΡΠΎΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ PARTITION BY, Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡΠ΅Π΅ OVER, ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΡΡΠΎΠΊΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎ Π³ΡΡΠΏΠΏΠ°ΠΌ ΠΈΠ»ΠΈ ΡΠ°Π·Π΄Π΅Π»Π°ΠΌ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ PARTITION BY. ΠΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ, ΠΏΠΎΠΏΠ°Π΄Π°ΡΡΠΈΠΌ Π² ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·Π΄Π΅Π» Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΎΠΉ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΡΠΎΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΎΠΊΠΎΠ½Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ORDER BY Π² OVER. (ΠΠΎΡΡΠ΄ΠΎΠΊ ORDER BY Π΄Π»Ρ ΠΎΠΊΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π΄Π°ΠΆΠ΅ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠΌ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ ΡΡΡΠΎΠΊΠΈ.) ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π·Π΄Π΅ΡΡ, ΡΡΠ½ΠΊΡΠΈΡ rank Π²ΡΠ΄Π°ΡΡ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ORDER BY. Π£ ΡΡΠ½ΠΊΡΠΈΠΈ rank Π½Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ OVER.
ΠΡ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ORDER BY ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΡΡΠΈΡΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΡΡΠΎΠΊ Π½Π΅ Π²Π°ΠΆΠ΅Π½. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΡΡΠΈΡΡ PARTITION BY, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·Π΄Π΅Π», ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ.
ΠΡΡΡ Π΅ΡΡ ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ΅ Ρ ΠΎΠΊΠΎΠ½Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ: Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π°Π±ΠΎΡ ΡΡΡΠΎΠΊ Π² Π΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ ΡΠ°ΠΌΠΊΠΎΠΉ ΠΎΠΊΠ½Π°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ORDER BY ΡΠ°ΠΌΠΊΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π²ΡΠ΅Ρ ΡΡΡΠΎΠΊ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·Π΄Π΅Π»Π° Π΄ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ ΡΡΡΠΎΠΊ, ΡΠ°Π²Π½ΡΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ORDER BY. ΠΠ΅Π· ORDER BY ΡΠ°ΠΌΠΊΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π²ΡΠ΅Ρ ΡΡΡΠΎΠΊ ΡΠ°Π·Π΄Π΅Π»Π°. [1] ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ sum :
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π΅Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ORDER BY Π² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ OVER, ΡΠ°ΠΌΠΊΠ° ΠΎΠΊΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠ°Π·Π΄Π΅Π»Π°, Π° ΠΎΠ½, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π±Π΅Π· ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ PARTITION BY Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ; Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΡΠΌΠΌΠ° Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ORDER BY, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ:
ΠΠ΄Π΅ΡΡ Π² ΡΡΠΌΠΌΠ΅ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡΡΡΡ Π·Π°ΡΠΏΠ»Π°ΡΡ ΠΎΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ (ΡΠ°ΠΌΠΎΠΉ Π½ΠΈΠ·ΠΊΠΎΠΉ) Π΄ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠ΅ΡΡ ΡΠ΅ΠΊΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² ΡΡΡΠΎΠΊΠ°Ρ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π·Π°ΡΠΏΠ»Π°ΡΠΎΠΉ).
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΏΠΈΡΠΊΠ΅ SELECT ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ ORDER BY. ΠΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΡ , Π²ΠΊΠ»ΡΡΠ°Ρ GROUP BY, HAVING ΠΈ WHERE, ΠΎΠ½ΠΈ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Ρ. ΠΡΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±ΡΡΠ½ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π° Π·Π½Π°ΡΠΈΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΈΠ· ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ, Π½ΠΎ Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ.
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ°Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, Ρ ΠΊΠΎΡΠΎΡΡΡ rank (ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ) ΠΌΠ΅Π½ΡΡΠ΅ 3.
ΠΠΎΠ³Π΄Π° Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΎΠΊΠΎΠ½, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ OVER, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΡΡΠΎ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π»ΡΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WINDOW, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π½Π΅Π³ΠΎ Π² OVER. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ·Π½Π°ΡΡ Π² ΠΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅ 4.2.8, Π Π°Π·Π΄Π΅Π»Π΅ 9.21, ΠΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅ 7.2.4 ΠΈ Π² ΡΠΏΡΠ°Π²ΠΊΠ΅ SELECT.
ΠΠ°ΠΊ ΠΏΠΎΡΡΠΈΡΠ°ΡΡ Π²ΡΡ Π½Π° ΡΠ²Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ SQL-Π·Π°ΠΏΡΠΎΡΠΎΠΌ. ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ PostgreSQL
Π― Ρ ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, Π΄Π°ΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ postgresql, Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΈΡΠ°Ρ ΠΈΡ
ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΎΡΠΎΠ±ΠΎΠΉ ΠΌΠ°Π³ΠΈΠ΅ΠΉ Π΄Π»Ρ ΠΈΠ·Π±ΡΠ°Π½Π½ΡΡ
. ΠΡ ΠΈΠ»ΠΈ Π² Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Β«ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΡΡΒ» ΡΠΎ StackOverflow Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° Β«row_number() OVER ()Β», Π½Π΅ Π²Π΄Π°Π²Π°ΡΡΡ Π² Π΄Π΅ΡΠ°Π»ΠΈ. Π Π²Π΅Π΄Ρ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ β ΠΏΠΎΠ»Π΅Π·Π½Π΅ΠΉΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» PostgreSQL.
ΠΠΎΠΏΡΠΎΠ±ΡΡ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎΠΌΡ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Ρ ΠΎΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΡΠ½ΠΈΡΡ, ΡΡΠΎ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π²ΡΠ±ΠΎΡΠΊΡ, Π° ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π΅ΠΉ. Π’.Π΅. Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ postgres ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²Π΅ΡΡ Π·Π°ΠΏΡΠΎΡ (ΠΊΡΠΎΠΌΠ΅ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ limit), Π° ΠΏΠΎΡΠΎΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ:
ΠΠΊΠ½ΠΎ β ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ΅Π΅ Π½Π°Π±ΠΎΡ ΡΡΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΡΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΡΠΈΡΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎ Π·Π°Π΄Π°Π½ΠΎ ΠΏΡΡΡΡΠΌΠΈ ΡΠΊΠΎΠ±ΠΊΠ°ΠΌΠΈ (), Ρ.Π΅. ΠΎΠΊΠ½ΠΎΠΌ ΡΠ²Π»ΡΡΡΡΡ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π·Π°ΠΏΡΠΎΡΠ°.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΡΠΎΠΌ ΡΠ΅Π»Π΅ΠΊΡΠ΅ ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΏΠΎΠ»ΡΠΌ id, header ΠΈ score ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡΡ Π½ΡΠΌΠ΅ΡΠ°ΡΠΈΡ ΡΡΡΠΎΠΊ.
Π ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ORDER BY, ΡΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π΅ΡΠ΅ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π·Π°ΠΏΠΎΡΠ° ORDER BY id, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ΅ΠΉΡΠΈΠ½Π³ ΠΏΠΎΡΡΠΈΡΠ°Π½ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π²Π΅ΡΠ½ΠΎ. Π’.Π΅. ΠΏΠΎΡΠ³ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π» ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ°Π±ΠΎΡΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠ΄ΠΈΠ½ order Π½ΠΈΡΡΡΡ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ Π΄ΡΡΠ³ΠΎΠΌΡ.
ΠΠ°Π»ΡΡΠ΅ β Π±ΠΎΠ»ΡΡΠ΅. Π ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»ΠΎΠ²ΠΎ PARTITION BY [expression],
Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ row_number() OVER (PARTITION BY section), ΡΠΎΠ³Π΄Π° ΠΏΠΎΠ΄ΡΡΠ΅Ρ Π±ΡΠ΄Π΅Ρ ΠΈΠ΄ΡΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ:
ΠΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΠ°ΡΡΠΈΡΠΈΡ, ΡΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΠ΅ΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π΅ΡΡ Π·Π°ΠΏΡΠΎΡ.
Π’ΡΡ ΡΡΠ°Π·Ρ Π½Π°Π΄ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΎ ΡΡΠ½ΠΊΡΠΈΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΡΠΉ Π½ΡΠ°Π½Ρ.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΠ°ΠΊ ΡΠΊΠ°Π·Π°ΡΡ, ΠΈΡΡΠΈΠ½Π½ΡΠ΅ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΠΌΠ°Π½ΡΠ°Π»Π° β ΡΡΠΎ row_number(), rank(), lead() ΠΈ Ρ.Π΄., Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-Π°Π³ΡΠ΅Π³Π°ΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ: sum(), count() ΠΈ Ρ.Π΄. Π’Π°ΠΊ Π²ΠΎΡ, ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎ, Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ»Π΅Π³ΠΊΠ° ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ: Π΅ΡΠ»ΠΈ Π½Π΅ Π·Π°Π΄Π°Π½ ORDER BY Π² ΠΎΠΊΠ½Π΅, ΠΈΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΈΡΠ΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ (ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅Ρ
ΡΡΡΠΎΠΊ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ). ΠΡΠ»ΠΈ ΠΆΠ΅ ORDER BY Π·Π°Π΄Π°Π½, ΡΠΎ ΠΏΠΎΠ΄ΡΡΠ΅Ρ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΈΠ΄Π΅Ρ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΠΏΠ°ΡΡΠΈΡΠΈΠΈ Π΄ΠΎ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅ΠΊΠ°Ρ (ΡΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π² Π²Π°ΠΊΡΡΠΌΠ΅) ΡΠ°Π±Π»ΠΈΡΠ° ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π±Π°Π»Π°Π½ΡΠΎΠ².
ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ·Π½Π°ΡΡ Π·Π°ΠΎΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΠ»ΡΡ ΠΎΡΡΠ°ΡΠΎΠΊ Π½Π° Π±Π°Π»Π°Π½ΡΠ΅ ΠΏΡΠΈ ΡΡΠΎΠΌ:
Π’.Π΅. Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ΅Ρ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΡΠ΅ΠΉΠΌΠ΅. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ΅ΠΉΠΌ β ΡΡΠΎ Π½Π°Π±ΠΎΡ ΡΡΡΠΎΠΊ ΠΎΡ Π½Π°ΡΠ°Π»Π° Π΄ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ (Π΅ΡΠ»ΠΈ Π±ΡΠ»ΠΎ Π±Ρ PARTITION BY, ΡΠΎ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΠΏΠ°ΡΡΠΈΡΠΈΠΈ).
ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΌΡ Π΄Π»Ρ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΡΠΈΠΈ sum Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ORDER BY Π² ΠΎΠΊΠ½Π΅, ΡΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΡΠΈΡΠ°Π΅ΠΌ ΠΎΠ±ΡΡΡ ΡΡΠΌΠΌΡ ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π΅Ρ Π²ΠΎ Π²ΡΠ΅Ρ
ΡΡΡΠΎΠΊΠ°Ρ
. Π’.Π΅. ΡΡΠ΅ΠΉΠΌΠΎΠΌ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΡ Π½Π°Π±ΠΎΡ ΡΡΡΠΎΠΊ
ΠΎΡ Π½Π°ΡΠ°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΏΠ°ΡΡΠΈΡΠΈΠΈ.
ΠΠΎΡ ΡΠ°ΠΊΠ°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π΅ΡΠ»ΠΈ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Π½ΡΠ΅. ΠΠ° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ-ΡΠ°ΠΊΠΈ ΡΡΡΠ°Π½Π½ΡΠΉ, ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ SQL-ΡΡΠ°Π½Π΄Π°ΡΡΠ°.
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΊ, ΠΎΠ½ΠΈ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ Π½ΠΈΡΡΡΡ Π½Π΅ ΠΌΠ΅ΡΠ°ΡΡ, ΡΡΠΎΠ±Ρ Π²Ρ ΡΠ°ΠΌ Π² Π½ΠΈΡ Π½Π΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ.
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΡΠ»Π΅ OVER, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΡΡ ΠΈΠΌ ΠΈΠΌΡ ΠΈ Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ WINDOW, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· ΠΌΠ°Π½ΡΠ°Π»Π°:
ΠΠ΄Π΅ΡΡ w ΠΏΠΎΡΠ»Π΅ ΡΠ»ΠΎΠ²Π° OVER ΠΈΠ΄Π΅Ρ Π±Π΅Π· ΡΠΆΠ΅ ΡΠΊΠΎΠ±ΠΎΠΊ.
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ WHERE, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ΅ΠΉ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΈ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠΈ, Ρ.Π΅. Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΠΎΠ±Ρ Π²ΡΠ±ΡΠ°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΏ 5 Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅, Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡ:
ΠΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ Π·Π°ΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΡ. ΠΠΎΠΌΠΈΠΌΠΎ row_number() Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ lag, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠ΅Ρ ΡΡΡΠΎΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΡΡΠ΅ΠΉΠΌΠ°. Π ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡΠΈ Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΊΠΎΠ² Π½ΠΎΠ²ΠΎΡΡΡ ΠΎΡΡΡΠ°Π΅Ρ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π² ΡΠ΅ΠΉΡΠΈΠ½Π³Π΅:
ΠΡΠΎΡΡ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Π½Π°ΠΊΠΈΠ΄Π°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², Π³Π΄Π΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΡΠΈΠΈ. Π ΡΠ°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ Ρ Π½ΠΈΠΌΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ.
ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ΡΡ Π½Π° ΠΏΠΎΠ΄ΠΊΠ°ΡΡ ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ «Π¦ΠΈΠ½ΠΊΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΄», Π³Π΄Π΅ ΠΌΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΡΠ·ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π²ΡΡ Π½Π° ΡΠ²Π΅ΡΠ΅!
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΠΈ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² PostgreSQL ΠΈ Oracle
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π² Π΄Π²ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΠΈ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ (Π² ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Oracle β Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅) ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠΈΡ Π² ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ ΠΈ Π² ΡΠ΅Π»ΠΎΠΌ Π² ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ ΠΊ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ, ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆ. ΠΠΎ ΠΈ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΡΠΎΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ.
ΠΠ°Π΄ΠΎ ΠΏΡΠΈΠ·Π½Π°ΡΡ, ΡΡΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΠΈ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ. ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΠΎΡΠ½ΠΎΡΡΡ ΠΊ ΡΠ°Π·ΡΡΠ΄Ρ Β«ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠ³ΠΎΒ» SQL ΠΈ ΡΡΠΈΡΠ°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΈ ΠΎΡΠ²ΠΎΠ΅Π½ΠΈΡ. Π’ΡΡ Π±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΡΠ΅ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ Π² Π‘Π£ΠΠ!
ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ³Π΄Π° Π²ΠΎΠΎΠ±ΡΠ΅ Π²Π½ΠΈΠΊΠ°ΡΡ Π² ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ? ΠΠΎΠ³Ρ Π½Π°Π·Π²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΠΈΠ½:
ΠΠ³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΡΠ΄Π΅ΠΌ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎΠΌΡ, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ PostgreSQL ΠΈ Oracle.
ΠΠ½Π°ΡΠ°Π»Π΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΡΠ±Π°Ρ Π°Π³ΡΠ΅Π³Π°ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΈΡ Π²ΡΠ΅. ΠΠ΅ΠΆΠ΄Ρ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ Π΅ΠΉ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π ΠΊΠΎΠ½ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅ΡΠ½ΡΡΡ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠ°ΠΊ, Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΡΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅:
PostgreSQL
ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ . ΠΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ, Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ²ΠΎΠΉ. ΠΠ»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, Π²ΡΡΠΈΡΠ»ΡΡΡΠ΅ΠΉ ΡΡΠ΅Π΄Π½Π΅Π΅, Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΡΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ²ΠΎΠΉ ΡΠΎΡΡΠ°Π²Π½ΠΎΠΉ ΡΠΈΠΏ Ρ Π΄Π²ΡΠΌΡ ΠΏΠΎΠ»ΡΠΌΠΈ:
CREATE TYPE average_state AS (
accum numeric,
qty numeric
);
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π PostgreSQL ΠΎΠ½Π° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π°:
ΠΡΠΎΠΌΠ΅ ΡΡΠΎΠ³ΠΎ, ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ (RAISE NOTICE) ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ β ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°. Π‘ΡΠ°ΡΡΠΉ Π΄ΠΎΠ±ΡΡΠΉ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ PRINT, Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠ΅Π±Ρ Π»ΡΡΡΠ΅.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ β Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
Β«Π€ΠΈΠ½Ρ ΡΡΠ°ΠΌΠΈΒ» Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ trim Π½ΡΠΆΠ΅Π½ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎΡΡΠΈ Π²ΡΠ²ΠΎΠ΄Π°: ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅ΠΌΡΡ ΠΎΡ Π½Π΅Π·Π½Π°ΡΠ°ΡΠΈΡ Π½ΡΠ»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½Π°ΡΠ΅ Π±ΡΠ΄ΡΡ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΡΠΊΡΠ°Π½ ΠΈ ΠΌΠ΅ΡΠ°ΡΡ Π²ΠΎΡΠΏΡΠΈΡΡΠΈΡ. ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π²ΠΎΡ ΡΠ°ΠΊ:
SELECT 1::numeric / 2::numeric;
?column?
————————
0.50000000000000000000
(1 row)
Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΡΡΠΈ ΡΠΎΠΊΡΡΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ Π½ΡΠΆΠ½Ρ.
Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° CREATE AGGREGATE:
ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ. ΠΠΎΡΡΠΈ Π²ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ Π² ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ Ρ ΠΏΡΡΡΡ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ: ΡΠ°Π·, Π΄Π²Π°, ΡΡΠΈ, ΡΠ΅ΡΡΡΠ΅, ΠΏΡΡΡ. Π’Π°Π±Π»ΠΈΡΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π° Π»Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ generate_series, Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡΠΌ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΎΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ :
SELECT average(g.x) FROM generate_series(1,5) AS g(x);
NOTICE: 0(0) + 1
NOTICE: 1(1) + 2
NOTICE: 3(2) + 3
NOTICE: 6(3) + 4
NOTICE: 10(4) + 5
NOTICE: = 15(5)
average
———
3
(1 row)
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²Π΅ΡΠ½ΡΠΉ, Π° Π²ΡΠ²ΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΡ Ρ ΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
SELECT average(g.x) FROM generate_series(1,0) AS g(x);
NOTICE: = 0(0)
average
———
Oracle
Π Oracle Π²ΡΡ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Data Cartridge. ΠΠΎΠ²ΠΎΡΡ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎΠΌΡ, Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΈΠΏ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠΎΠ½ΡΠ΅ΠΊΡΡ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
CREATE OR REPLACE TYPE AverageImpl AS OBJECT(
accum number,
qty number,
STATIC FUNCTION ODCIAggregateInitialize (actx IN OUT AverageImpl)
RETURN number,
MEMBER FUNCTION ODCIAggregateIterate (self IN OUT AverageImpl, val IN number
RETURN number,
MEMBER FUNCTION ODCIAggregateMerge (self IN OUT AverageImpl, ctx2 IN AverageImpl)
RETURN number,
MEMBER FUNCTION ODCIAggregateTerminate (self IN OUT AverageImpl, returnValue OUT number, flags IN number)
RETURN number
);
/
ΠΠ°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π·Π΄Π΅ΡΡ Π½Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ, Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ (ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ, ΡΠΎ Π΅ΡΡΡ Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°) ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ODCIAggregateInitialize.
Π€ΡΠ½ΠΊΡΠΈΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ β ΡΡΠΎ ODCIAggregateIterate.
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ODCIAggregateTerminate, ΠΈ Π΅ΠΉ, Π·Π°ΠΌΠ΅ΡΡΡΠ΅, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π½Π΅ΠΊΠΈΠ΅ ΡΠ»Π°Π³ΠΈ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ: ODCIAggregateMerge. ΠΡ Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ β ΠΊΡΠ΄Π° ΠΆ Π΄Π΅Π²Π°ΡΡΡΡ, β Π½ΠΎ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡ ΠΎ Π½Π΅ΠΉ ΠΏΠΎΠΊΠ° ΠΎΡΠ»ΠΎΠΆΠΈΠΌ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ΅Π»ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
CREATE OR REPLACE TYPE BODY AverageImpl IS
STATIC FUNCTION ODCIAggregateInitialize (actx IN OUT AverageImpl)
RETURN number IS
BEGIN
actx := AverageImpl(0,0);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate (self IN OUT AverageImpl, val IN number)
RETURN number IS
BEGIN
dbms_output.put_line(self.accum||'(‘||self.qty||’) + ‘||val);
self.accum := self.accum + val;
self.qty := self.qty + 1;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge (self IN OUT AverageImpl, ctx2 IN AverageImpl)
RETURN number IS
BEGIN
dbms_output.put_line(self.accum||'(‘||self.qty||’) & ‘||ctx2.accum||'(‘||ctx2.qty||’)’);
self.accum := self.accum + ctx2.accum;
self.qty := self.qty + ctx2.qty;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate (self IN OUT AverageImpl, returnValue OUT number, flags IN number)
RETURN number IS
BEGIN
dbms_output.put_line(‘= ‘||self.accum||'(‘||self.qty||’) flags:’||flags);
returnValue := CASE WHEN self.qty > 0 THEN self.accum / self.qty END;
RETURN ODCIConst.Success;
END;
END;
/
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΏΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ, ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ Π²ΡΠ΅ ΡΠΎ, ΡΡΠΎ ΠΌΡ Π΄Π΅Π»Π°Π»ΠΈ Π΄Π»Ρ PostgreSQL, Π½ΠΎ Π² Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅.
Trim-ΠΏΠ»ΡΡΠΊΠΈ Π²ΠΎΠΊΡΡΠ³ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ Π½ΡΠΆΠ½Ρ: Oracle ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΡΠ΅Π·Π°Π΅Ρ Π½Π΅Π·Π½Π°ΡΠ°ΡΠΈΠ΅ Π½ΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ODCIConst.Success), Π° ΡΠΌΡΡΠ»ΠΎΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ OUT ΠΈ IN OUT (ΠΊΠΎΡΠΎΡΡΠ΅ Π² PL/SQL Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ Π² PL/pgSQL). Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π»ΡΠ±Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ODCIAggregateTerminate, ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π΅ΠΉ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ (self).
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
CREATE OR REPLACE FUNCTION average(val number) RETURN number
AGGREGATE USING AverageImpl;
/
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ. ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΠ΄ΠΈΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ CONNECT BY level:
SELECT average(level) FROM dual CONNECT BY level
ΠΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² PostgreSQL ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°, Π° Π² Oracle β ΠΏΠΎΡΠ»Π΅. ΠΡΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ RAISE NOTICE ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ, Π° ΠΏΠ°ΠΊΠ΅Ρ dbms_output Π±ΡΡΠ΅ΡΠΈΠ·ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄.
ΠΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, Π² ΡΡΠ½ΠΊΡΠΈΡ ODCIAggregateTerminate Π±ΡΠ» ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠ»Π°Π³. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈ Π΅Π³ΠΎ β ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ β ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±ΡΡΡ.
Π ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΏΡΡΡΠΎΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅:
SELECT average(rownum) FROM dual WHERE 1 = 0;
AVERAGE(ROWNUM)
—————
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ: OVER()
Π₯ΠΎΡΠΎΡΠ°Ρ Π½ΠΎΠ²ΠΎΡΡΡ: Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ Π½Π°ΠΌΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±Π΅Π· Π²ΡΡΠΊΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Π½Π°Ρ (Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ).
ΠΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π΅ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ±ΠΎΡΠΊΡ Π² ΠΎΠ΄Π½Ρ (Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ) ΡΡΡΠΎΠΊΡ, Π° Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π±Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·ΠΎΠ² ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ OVER Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΌΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. Π ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½Π° ΡΠ°ΠΊ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ: OVER(), ΠΈ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΠΌΡ ΠΏΠΎΡΡΠΈΡΠ°Π»ΠΈ ΠΎΠ±ΡΡΠ½ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ (ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅) Π½Π°ΠΏΡΠΎΡΠΈΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΠ±ΠΎΡΠΊΠΈ.
ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΠ°ΠΌΠΊΠ° ΡΡΠ°ΡΠΈΡΠ½Π° ΠΈ ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ:
PostgreSQL
SELECT g.x, average(g.x) OVER ()
FROM generate_series(1,5) as g(x);
NOTICE: 0(0) + 1
NOTICE: 1(1) + 2
NOTICE: 3(2) + 3
NOTICE: 6(3) + 4
NOTICE: 10(4) + 5
NOTICE: = 15(5)
x | average
—+———
1 | 3
2 | 3
3 | 3
4 | 3
5 | 3
(5 rows)
ΠΠΎ Π²ΡΠ²ΠΎΠ΄Ρ NOTICE Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΉ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΠ»ΡΡΠΈΠ² ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ average_final, PostgreSQL ΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΅Π³ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
Oracle
SELECT average(level) OVER() average
FROM dual CONNECT BY level
ΠΠ΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Oracle Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ODCIAggregateTerminate N+1 ΡΠ°Π·: ΡΠ½Π°ΡΠ°Π»Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Ρ ΡΠ»Π°Π³ΠΎΠΌ 1 (ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π΅ΡΠ΅ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ) ΠΈ Π·Π°ΡΠ΅ΠΌ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π² ΠΊΠΎΠ½ΡΠ΅. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅, ΠΏΡΠΎΡΡΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ.
ΠΡΠ²ΠΎΠ΄ ΡΠ°ΠΊΠΎΠΉ: Π΅ΡΠ»ΠΈ Π² ΡΡΠ½ΠΊΡΠΈΠΈ ODCIAggregateTerminate ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ°, Π½Π°Π΄ΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π΅ Π΄Π΅Π»Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΠ°Π±ΠΎΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·.
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ: OVER(PARTITION BY)
ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ PARTITION BY Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠ°ΠΌΠΊΠΈ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΎΠ±ΡΡΠ½ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ GROUP BY. ΠΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ PARTITION BY Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΡΡΡΠΎΠΊ, ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΈΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π²ΡΠ±ΠΎΡΠΊΠΈ.
Π ΡΠ°ΠΊΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΡΠ°ΠΌΠΊΠ° ΡΠΎΠΆΠ΅ ΡΡΠ°ΡΠΈΡΠ½Π°, Π½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΠΎΠ½Π° ΡΠ°Π·Π½Π°Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ ΡΡΡΠΎΠΊ (Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΠΎ Π²ΡΠΎΡΡΡ ΠΈ Ρ ΡΡΠ΅ΡΡΠ΅ΠΉ ΠΏΠΎ ΠΏΡΡΡΡ), ΡΠΎ ΡΠ°ΠΌΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ΅Π±Π΅ ΡΠ°ΠΊ:
PostgreSQL
SELECT g.x/3 part,
g.x,
average(g.x) OVER (PARTITION BY g.x/3)
FROM generate_series(1,5) as g(x);
NOTICE: 0(0) + 1
NOTICE: 1(1) + 2
NOTICE: = 3(2)
NOTICE: 0(0) + 3
NOTICE: 3(1) + 4
NOTICE: 7(2) + 5
NOTICE: = 12(3)
part | x | average
——+—+———
0 | 1 | 1.5
0 | 2 | 1.5
1 | 3 | 4
1 | 4 | 4
1 | 5 | 4
(5 rows)
ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ ΠΊ Π΄ΡΡΠ³ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ ΡΡΡΠΎΠΊ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ Π² Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (initcond).
Oracle
SELECT trunc(level/3) part,
level,
average(level) OVER(PARTITION BY trunc(level/3)) average
FROM dual CONNECT BY level 0(0) + 2
2(1) + 1
= 3(2) flags:1
= 3(2) flags:1
0(0) + 4
4(1) + 5
9(2) + 3
= 12(3) flags:1
= 12(3) flags:1
= 12(3) flags:1
= 12(3) flags:0
ΠΠ°Π½ΡΡΠ½ΠΎ, ΡΡΠΎ Oracle ΡΠ΅ΡΠΈΠ» ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²ΠΈΡΡ ΡΡΡΠΎΠΊΠΈ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΎ-ΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΎ Π΄Π΅ΡΠ°Π»ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π½ΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π²ΠΎ.
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ: OVER(ORDER BY)
ΠΡΠ»ΠΈ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ORDER BY, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠ΅Π΅ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΡΠ½Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π½Π°ΡΠ°ΡΡΠ°Π½ΠΈΡ (Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ sum ΠΌΡ Π±Ρ ΡΠ°ΠΊ ΠΈ ΡΠΊΠ°Π·Π°Π»ΠΈ β Π½Π°ΡΠ°ΡΡΠ°ΡΡΠΈΠΌ ΠΈΡΠΎΠ³ΠΎΠΌ).
ΠΠ»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ°ΠΌΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΈ; Π΄Π»Ρ Π²ΡΠΎΡΠΎΠΉ β ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈ Π²ΡΠΎΡΠΎΠΉ; Π΄Π»Ρ ΡΡΠ΅ΡΡΠ΅ΠΉ β ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠΉ, Π²ΡΠΎΡΠΎΠΉ ΠΈ ΡΡΠ΅ΡΡΠ΅ΠΉ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π² ΡΠ°ΠΌΠΊΡ Π±ΡΠ΄ΡΡ Π²Ρ ΠΎΠ΄ΠΈΡΡ ΡΡΡΠΎΠΊΠΈ Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π΄ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ²Π½ΠΎ ΡΠ°ΠΊ ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ: OVER(ORDER BYβ¦ ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°ΡΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΅Π³ΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠΏΡΡΠΊΠ°ΡΡ.
ΠΡΠ°ΠΊ, ΡΠ°ΠΌΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ Π±ΡΡΡ ΡΡΠ°ΡΠΈΡΠ½ΠΎΠΉ: Π΅Π΅ Π³ΠΎΠ»ΠΎΠ²Π° Π΄Π²ΠΈΠΆΠ΅ΡΡΡ Π²Π½ΠΈΠ·, Π° Ρ Π²ΠΎΡΡ ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅:
PostgreSQL
SELECT g.x, average(g.x) OVER (ORDER BY g.x)
FROM generate_series(1,5) as g(x);
NOTICE: 0(0) + 1
NOTICE: = 1(1)
NOTICE: 1(1) + 2
NOTICE: = 3(2)
NOTICE: 3(2) + 3
NOTICE: = 6(3)
NOTICE: 6(3) + 4
NOTICE: = 10(4)
NOTICE: 10(4) + 5
NOTICE: = 15(5)
x | average
—+———
1 | 1
2 | 1.5
3 | 2
4 | 2.5
5 | 3
(5 rows)
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΡΠΎΠΊΠΈ Π²ΡΠ΅ ΡΠ°ΠΊ ΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ, Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ average_final Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ, Π²ΡΠ΄Π°Π²Π°Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΠΈΡΠΎΠ³.
Oracle
SELECT level, average(level) OVER(ORDER BY level) average
FROM dual CONNECT BY level
ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΎΠ±Π΅ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ: OVER(PARTITION BY ORDER BY)
ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ PARTITION BY ΠΈ ORDER BY ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ. Π’ΠΎΠ³Π΄Π° Π²Π½ΡΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΡΡΡΠΎΠΊ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π½Π°ΡΠ°ΡΡΠ°Π½ΠΈΡ, Π° ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ ΠΎΡ Π³ΡΡΠΏΠΏΡ ΠΊ Π³ΡΡΠΏΠΏΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ Π² Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅.
PostgreSQL
Oracle
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅ΠΉ ΡΠ°ΠΌΠΊΠΎΠΉ
ΠΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π»ΠΈ, ΡΠ°ΠΌΠΊΠ° Π»ΠΈΠ±ΠΎ Π±ΡΠ»Π° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ, Π»ΠΈΠ±ΠΎ Π΄Π²ΠΈΠ³Π°Π»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π΅ Π³ΠΎΠ»ΠΎΠ²Π° (ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ORDER BY). ΠΡΠΎ Π΄Π°Π²Π°Π»ΠΎ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΡΠΈΡΠ»ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΡΡΡΠΎΠΊΡ Π·Π° ΡΡΡΠΎΠΊΠΎΠΉ.
ΠΠΎ ΡΠ°ΠΌΠΊΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎ Π΅Π΅ Ρ Π²ΠΎΡΡ ΡΠΎΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ. Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ½ΡΡΠΈΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ OVER(ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π±ΡΠ΄ΡΡ ΡΡΡΠ΅Π΄Π½ΡΡΡΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΈ Π΄Π²Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
Π‘ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ ΠΎΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅? ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΠΌΠΎΠΆΠ΅Ρ, ΠΏΡΠ°Π²Π΄Π° Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΠΎ, Π½Π°ΠΏΠΈΡΠ°Π² Π΅ΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»ΡΡΡΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ.
PostgreSQL
SELECT g.x,
average(g.x) OVER (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM generate_series(1,5) as g(x);
NOTICE: 0(0) + 1
NOTICE: = 1(1)
NOTICE: 1(1) + 2
NOTICE: = 3(2)
NOTICE: 3(2) + 3
NOTICE: = 6(3)
NOTICE: 0(0) + 2
NOTICE: 2(1) + 3
NOTICE: 5(2) + 4
NOTICE: = 9(3)
NOTICE: 0(0) + 3
NOTICE: 3(1) + 4
NOTICE: 7(2) + 5
NOTICE: = 12(3)
x | average
—+———
1 | 1
2 | 1.5
3 | 2
4 | 3
5 | 4
(5 rows)
ΠΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΠ΅ ΠΈΠ΄Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π²ΠΎΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ Π΄Π²ΠΈΠ³Π°Π΅ΡΡΡ: ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠ΅ΠΌΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ ΡΠΌΠ΅Π΅ΠΌ ΡΠ±ΠΈΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠΉ ΠΈ ΠΏΡΡΠΎΠΉ ΡΡΡΠΎΠΊ Π²ΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡ ΠΊ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
ΠΡΠ°ΠΊ, Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ ΠΈΠΌΠ΅ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΠ°ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ:
Π§ΡΠΎΠ±Ρ ΠΎΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΌΠΎΠ³Π»Π° Π΅ΠΉ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°ΡΡ Π°Π³ΡΠ΅Π³Π°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Oracle
Π’ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°. Π‘ΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ:
SELECT level,
average(level) OVER(ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) average
FROM dual CONNECT BY level 0(0) + 2
2(1) + 3
5(2) + 4
= 9(3) flags:1
0(0) + 3
3(1) + 4
7(2) + 5
= 12(3) flags:1
= 12(3) flags:0
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ. ΠΡΠΎΠ²Π΅ΡΠΈΠΌ:
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΡΡΡ
Π PostgreSQL, ΠΈ Oracle (Enterprise Edition) ΡΠΌΠ΅ΡΡ Π²ΡΡΠΈΡΠ»ΡΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΡΠΈ ΡΡΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ²ΠΎΡ ΡΠ°ΡΡΡ ΡΠ°Π±ΠΎΡΡ, ΡΠΎΡΠΌΠΈΡΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠ°ΡΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ-ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΎΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΈΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ΅.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½Π° Π΅ΡΠ΅ ΠΎΠ΄Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΈ Π½Π°ΠΏΠΈΡΠ΅ΠΌ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΠΈ ΡΡΠΌΠΌΡ, ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
PostgreSQL
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄, ΡΠΎ ΠΎΡΠΏΠ°Π΄Π°Π΅Ρ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΠΉ ΡΠ·ΡΠΊ β Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΡΠΈΡΡΠΎΠΌ SQL:
CREATE TABLE t(n) AS SELECT generate_series(1,1000)::numeric;
Π‘ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ PostgreSQL Π½Π΅ ΠΏΠΎΡΡΡΠΎΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ ΠΏΠ»Π°Π½ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ β ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΎΠ½Π° ΠΌΠ°Π»Π°, β Π½ΠΎ Π΅Π³ΠΎ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ³ΠΎΠ²ΠΎΡΠΈΡΡ:
SET parallel_setup_cost=0;
SET min_parallel_table_scan_size=0;
EXPLAIN(costs off) SELECT average(n) FROM t;
QUERY PLAN
——————————————
Finalize Aggregate
-> Gather
Workers Planned: 2
-> Partial Aggregate
-> Parallel Seq Scan on t
Π ΠΏΠ»Π°Π½Π΅ Π·Π°ΠΏΡΠΎΡΠ° Π²ΠΈΠ΄ΠΈΠΌ:
SELECT average(n) FROM t;
NOTICE: 0(0) & 281257(678)
NOTICE: 281257(678) & 127803(226)
NOTICE: 409060(904) & 91440(96)
NOTICE: = 500500(1000)
average
———
500.5
(1 row)
ΠΠΎΡΠ΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ average_combine Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠΈ ΡΠ°Π·Π°, Π° Π½Π΅ Π΄Π²Π°? ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π² PostgreSQL ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ°ΡΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠΎΡΡΠΎΠΌΡ, Ρ ΠΎΡΡ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π΄Π²Π° ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠ΅Π°Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡ Π² ΡΡΠ΅Ρ . ΠΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ ΡΡΠΏΠ΅Π» ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ 678 ΡΡΡΠΎΠΊ, Π΄ΡΡΠ³ΠΎΠΉ 226 ΠΈ ΡΡΠ΅ΡΠΈΠΉ β 96 (Ρ ΠΎΡΡ ΡΡΠΈ ΡΠΈΡΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡΠ°Ρ ΠΈ ΠΏΡΠΈ Π΄ΡΡΠ³ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ).
Oracle
ΠΡΠ»ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠ½ΠΊΡΠΈΡ ODCIAggregateMerge ΠΌΡ ΡΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² Oracle ΠΎΠ½Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π°ΡΡΠ°ΠΈΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ, Π½ΠΎ ΠΈ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ β Ρ ΠΎΡΡ ΠΌΠ½Π΅ ΡΡΡΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡΡ, Π·Π°ΡΠ΅ΠΌ (ΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅).
ΠΡΠ΅, ΡΡΠΎ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ β ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ:
CREATE OR REPLACE FUNCTION average(val number) RETURN number
PARALLEL_ENABLE
AGGREGATE USING AverageImpl;
/
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°Π±Π»ΠΈΡΡ:
CREATE TABLE t(n) AS SELECT to_number(level) FROM dual CONNECT BY level
Π£Π³ΠΎΠ²ΠΎΡΠΈΡΡ Oracle Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ PostgreSQL β Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Ρ
ΠΈΠ½Ρ. ΠΠΎΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠ»Π°Π½ (Π²ΡΠ²ΠΎΠ΄ ΡΠΈΠ»ΡΠ½ΠΎ ΡΡΠ΅Π·Π°Π½ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ):
EXPLAIN PLAN FOR SELECT /*+ PARALLEL(2) */ average(n) FROM t;
SELECT * FROM TABLE(dbms_xplan.display);
———————————
| Id | Operation |
———————————
| 0 | SELECT STATEMENT |
| 1 | SORT AGGREGATE |
| 2 | PX COORDINATOR |
| 3 | PX SEND QC (RANDOM) |
| 4 | SORT AGGREGATE |
| 5 | PX BLOCK ITERATOR |
| 6 | TABLE ACCESS FULL |
———————————
ΠΠ»Π°Π½ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ:
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
Π‘Π°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π½Π° Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΠ΅ ΠΈ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ Π² Π‘Π£ΠΠ. Π’Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠ΅Π΅ΠΊ
Π ΠΎΠ±Π΅ΡΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· ΠΆΠΈΠ·Π½ΠΈ. ΠΡΡ ΡΡΠ½ΠΊΡΠΈΡ Ρ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π», ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΎΡΡΠ΅ΡΡ Π΄Π»Ρ Π±ΡΡ Π³Π°Π»ΡΠ΅ΡΠΈΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ ΠΏΠΎ Π Π‘ΠΠ£ (ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΡΠΎΡΡΠΈΠΉΡΠΊΠΎΠ³ΠΎ Π±ΡΡ ΡΡΠ΅ΡΠ°).
Π‘Π°ΠΌΠ°Ρ ΠΏΡΠΎΡΡΠ°Ρ Π·Π°Π΄Π°ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΡ β ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠΈΡ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ² (ΡΠΊΠ°ΠΆΠ΅ΠΌ, 100 ΡΡΠ±Π»Π΅ΠΉ) Π½Π° ΠΎΡΠ΄Π΅Π»Ρ (ΡΠΊΠ°ΠΆΠ΅ΠΌ, 3 ΡΡΡΠΊΠΈ) ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ (ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΏΠΎΡΠΎΠ²Π½Ρ):
WITH depts(name) AS (
VALUES (‘A’), (‘B’), (‘C’)
), report(dept,amount) AS (
SELECT name, 100.00 / count(*) OVER() FROM depts
)
SELECT dept, round(amount,2) FROM report;
dept | round
——+——-
A | 33.33
B | 33.33
C | 33.33
(3 rows)
ΠΡΠΎΡ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: ΡΡΠΌΠΌΡ Π½Π°Π΄ΠΎ ΠΎΠΊΡΡΠ³Π»ΡΡΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ΅ΡΡΠ΅ΡΡΡ ΠΊΠΎΠΏΠ΅ΠΉΠΊΠ°. Π Π Π‘ΠΠ£ ΡΡΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΡΠ°Π΅Ρ.
ΠΠ°Π΄Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ°ΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ, Π½ΠΎ Π½Π° ΠΌΠΎΠΉ Π²ΠΊΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± β ΠΎΠΊΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π½Π°ΡΠ°ΡΡΠ°ΡΡΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΈ Π±Π΅ΡΠ΅Ρ Π²ΡΡ Π±ΠΎΡΡΠ±Ρ Ρ ΠΊΠΎΠΏΠ΅ΠΉΠΊΠ°ΠΌΠΈ Π½Π° ΡΠ΅Π±Ρ:
WITH depts(name) AS (
VALUES (‘A’), (‘B’), (‘C’)
), report(dept,amount) AS (
SELECT name, 100.00 / count(*) OVER() FROM depts
)
SELECT dept, round2(amount) OVER (ORDER BY dept) FROM report;
dept | round2
——+———
A | 33.33
B | 33.34
C | 33.33
(3 rows)
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΡ (r_error) ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΎΠΊΡΡΠ³Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (amount). Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΡ, ΠΈ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΡΠΆΠ΅ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΏΠΎΠ»ΠΊΠΎΠΏΠ΅ΠΉΠΊΠΈ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΊ ΠΎΠΊΡΡΠ³Π»Π΅Π½Π½ΠΎΠΉ ΡΡΠΌΠΌΠ΅ ΠΊΠΎΠΏΠ΅Π΅ΡΠΊΡ:
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ Π½Π΅ Π±ΡΠ΄Ρ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π΅Π΅ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ.
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π°Π³ΡΠ΅Π³Π°ΡΠ½ΡΡ ΠΈΠ»ΠΈ ΠΎΠΊΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ β ΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ΡΡ ΠΈΠΌΠΈ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ .
- 3 ΠΈΡΠ»Ρ ΠΏΡΠ°Π·Π΄Π½ΠΈΠΊ Π΄Π΅Π½Ρ Π³ΠΈΠ±Π΄Π΄
- Π£ ΡΠΎΠ±Π°ΠΊΠΈ ΡΠ΅ΠΊΡΡ ΡΠ»ΡΠ½ΠΈ ΠΈ ΡΠ»Π°Π±ΠΎΡΡΡ Π½Π΅Ρ Π°ΠΏΠΏΠ΅ΡΠΈΡΠ° ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ