9.21. ÐконнÑе ÑÑнкÑии
ÐконнÑе ÑÑнкÑии даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑполнÑÑÑ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ñ Ð½Ð°Ð±Ð¾Ñом ÑÑÑок, каким-либо обÑазом ÑвÑзаннÑм Ñ ÑекÑÑей ÑÑÑокой запÑоÑа. ÐводнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± ÑÑом можно полÑÑиÑÑ Ð² Разделе 3.5, а подÑобнее ÑзнаÑÑ Ð¾ ÑинÑакÑиÑе можно в ÐодÑазделе 4.2.8.
ÐÑÑÑоеннÑе оконнÑе ÑÑнкÑии пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.57. ÐамеÑÑÑе, ÑÑо ÑÑи ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзÑваÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ как оконнÑе, Ñ. е. пÑи вÑзове необÑ
одимо иÑполÑзоваÑÑ Ð¿Ñедложение OVER.
Рдополнение к ÑÑим ÑÑнкÑиÑм в каÑеÑÑве оконнÑÑ
можно иÑполÑзоваÑÑ Ð»ÑбÑе вÑÑÑоеннÑе или полÑзоваÑелÑÑкие ÑнивеÑÑалÑнÑе или ÑÑаÑиÑÑиÑеÑкие агÑегаÑнÑе ÑÑнкÑии (но не ÑоÑÑиÑÑÑÑие и не гипоÑезиÑÑÑÑие); ÑпиÑок вÑÑÑоеннÑÑ
агÑегаÑнÑÑ
ÑÑнкÑий пÑиведÑн в Разделе 9.20. ÐгÑегаÑнÑе ÑÑнкÑии ÑабоÑаÑÑ ÐºÐ°Ðº оконнÑе, ÑолÑко когда за иÑ
вÑзовом ÑледÑÐµÑ Ð¿Ñедложение OVER; в пÑоÑивном ÑлÑÑае они ÑабоÑаÑÑ ÐºÐ°Ðº обÑÑнÑе, не оконнÑе ÑÑнкÑии и вÑдаÑÑ Ð´Ð»Ñ Ð²Ñего набоÑа единÑÑвеннÑÑ ÑÑÑокÑ.
ТаблиÑа 9.57. ÐконнÑе ÑÑнкÑии обÑего назнаÑениÑ
РезÑлÑÑÐ°Ñ Ð²ÑеÑ
ÑÑнкÑий, пеÑеÑиÑленнÑÑ
в ТаблиÑе 9.57, завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð¾ÑÑдка ÑоÑÑиÑовки, заданного пÑедложением ORDER BY в опÑеделении ÑооÑвеÑÑÑвÑÑÑего окна. СÑÑоки, коÑоÑÑе ÑвлÑÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми пÑи ÑаÑÑмоÑÑении ÑолÑко ÑÑолбÑов ORDER BY, ÑÑиÑаÑÑÑÑ ÑодÑÑвеннÑми. ЧеÑÑÑе ÑÑнкÑии, вÑÑиÑлÑÑÑие Ñанг (вклÑÑÐ°Ñ cume_dist), ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ñак, ÑÑо иÑ
ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм Ð´Ð»Ñ Ð²ÑеÑ
ÑодÑÑвеннÑÑ
ÑÑÑок.
ÐамеÑÑÑе, ÑÑо ÑÑнкÑии first_value, last_value и nth_value ÑаÑÑмаÑÑиваÑÑ ÑолÑко ÑÑÑоки в «Ñамке окна», коÑоÑÐ°Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑодеÑÐ¶Ð¸Ñ ÑÑÑоки Ð¾Ñ Ð½Ð°Ñала Ñаздела до поÑледней ÑодÑÑвенной ÑÑÑоки Ð´Ð»Ñ ÑекÑÑей. ÐоÑÑÐ¾Ð¼Ñ ÑезÑлÑÑаÑÑ last_value и иногда nth_value могÑÑ Ð±ÑÑÑ Ð½Ðµ оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ. Ð ÑакиÑ
ÑлÑÑаÑÑ
можно пеÑеопÑеделиÑÑ ÑамкÑ, добавив в пÑедложение OVER подÑ
одÑÑее Ñказание (RANGE или ROWS). ÐодÑобнее ÑÑи ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² ÐодÑазделе 4.2.8.
Ðогда в каÑеÑÑве оконной ÑÑнкÑии иÑполÑзÑеÑÑÑ Ð°Ð³ÑегаÑнаÑ, она обÑабаÑÑÐ²Ð°ÐµÑ ÑÑÑоки в Ñамке ÑекÑÑей ÑÑÑоки. ÐгÑегаÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ñ ORDER BY и опÑеделением Ñамки окна по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ ÐºÐ°Ðº «бегÑÑÐ°Ñ ÑÑмма», ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð¼Ñ ÑезÑлÑÑаÑÑ. ЧÑÐ¾Ð±Ñ Ð°Ð³ÑегаÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ ÑабоÑала Ñо вÑем Ñазделом, ÑледÑÐµÑ Ð¾Ð¿ÑÑÑиÑÑ ORDER BY или иÑполÑзоваÑÑ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. ÐÑполÑзÑÑ Ð´ÑÑгие ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð² опÑеделении Ñамки, можно полÑÑиÑÑ Ð¸ дÑÑгие ÑÑÑекÑÑ.
ÐÑимеÑание
Ð ÑÑандаÑÑе SQL опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿Ð°ÑамеÑÑÑ RESPECT NULLS или IGNORE NULLS Ð´Ð»Ñ ÑÑнкÑий lead, lag, first_value, last_value и nth_value. Ð PostgreSQL Ñакие паÑамеÑÑÑ Ð½Ðµ ÑеализованÑ: ÑÑи ÑÑнкÑии ведÑÑ ÑÐµÐ±Ñ Ñак, как положено в ÑÑандаÑÑе по ÑмолÑÐ°Ð½Ð¸Ñ (или Ñ Ð¿Ð¾Ð´ÑазÑмеваемÑм паÑамеÑÑом RESPECT NULLS). Также ÑÑнкÑÐ¸Ñ nth_value не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑедÑÑмоÑÑеннÑе ÑÑандаÑÑом паÑамеÑÑÑ FROM FIRST и FROM LAST: Ñеализовано ÑолÑко поведение по ÑмолÑÐ°Ð½Ð¸Ñ (Ñ Ð¿Ð¾Ð´ÑазÑмеваемÑм паÑамеÑÑом FROM FIRST). (ÐолÑÑиÑÑ ÑÑÑÐµÐºÑ Ð¿Ð°ÑамеÑÑа FROM LAST можно, изменив поÑÑдок ORDER BY на обÑаÑнÑй.)
ФÑнкÑÐ¸Ñ cume_dist вÑÑиÑлÑÐµÑ Ð¿ÑоÑÐµÐ½Ñ ÑÑÑок Ñаздела, коÑоÑÑе менÑÑе или ÑÐ°Ð²Ð½Ñ ÑекÑÑей ÑÑÑоке или ÑодÑÑвеннÑм ей ÑÑÑокам, Ñогда как percent_rank вÑÑиÑлÑÐµÑ Ð¿ÑоÑÐµÐ½Ñ ÑÑÑок Ñаздела, коÑоÑÑе менÑÑе ÑекÑÑей ÑÑÑоки, в пÑедположении, ÑÑо ÑекÑÑÐ°Ñ ÑÑÑока не оÑноÑиÑÑÑ Ðº ÑазделÑ.