Віконна функція (SQL)

В SQL віконна функція — функція, яка виконує обчислення над набором рядків, який визначається для кожного рядка вхідної таблиці окремо і називається вікном, причому кількість рядків цього набору у підсумковій таблиці не змінюється. Віконні функції вперше з'явилися у стандарті SQL:2003.

Синтаксис

Синтаксис віконної функції виглядає так[1]:

<віконна_функція>() OVER (
    [PARTITION BY вираз_1 [, вираз_2, ...]]
    [ORDER BY вираз_порядкування [ASC|DESC] [, ...]]
    [рамкова_умова]
)

Тут

  • OVER(…) — обов'язкова частина, яка задає правила визначення вікна (набору рядків) для кожного рядка вхідної таблиці;[2]
  • PARTITION BY задає розбиття рядків на підгрупи (як GROUP BY, але без агрегації в один рядок);[3]
  • ORDER BY задає порядок всередині вікна;[4]
  • рамкова_умова — умова, яку має задовольняти рядок вхідної таблиці, щоб входити до вікна певного рядка.[5]

Типи віконних функцій

Агрегатні функції як віконні

Кожну агрегатну функцію можна перетворити на віконну, бо для них вікна нічим не відрізняються від груп, утворених GROUP BY.[6]

Функції впорядкування

Функція впорядкування (англ. ranking functions[7] або англ. ordinal functions) повертає певний порядковий номер рядка у вікні. Щоб отримати змістовний результат обчислення такої функції, потрібно задати певний порядок у вікні через ORDER BY.[8]

Перелік деякий функцій впорядкування:

  • ROW_NUMBER() повертає унікальний порядковий номер рядка у вікні, починаючи з 1, відповідно до сортування, заданого в ORDER BY.[8]
  • RANK() повертає номер рядка за заданим порядком у вікні, при цьому рядки з однаковими значеннями по колонках, заданих в ORDER BY, отримують однаковий ранг, а наступний збільшується на кількість цих значень.[8][9]
  • DENSE_RANK() повертає номер рядка за заданим порядком у вікні, при цьому рядки з однаковими значеннями по колонках, заданих в ORDER BY, отримують однаковий ранг, а наступний збільшується на одиницю.[10][11]
  • PERCENT_RANK() повертає відносний ранг рядка у вікні у вигляді числа від 0 до 1. Якщо вікно містить n рядків при n > 1, а певний рядок має ранг r, то його відносний ранг дорівнює Якщо вікно містить один рядок, то відносний ранг його єдиного рядка дорівнює NULL.[12][13]
  • CUME_DIST() (cumulative distribution — кумулятивний розподіл) показує, яка частка рядків у вікні менша або дорівнює певному рядку, відповідно до сортування, заданого в ORDER BY. Якщо вікно містить n рядків, а певний рядок за заданим порядком у вікні йде перед або дорівнює p рядкам, то для нього значення цієї віконної функції дорівнює [12][13]
  • NTILE(n) розбиває вікно на n груп, які містять приблизно однакову кількість рядків, присвоюючи кожній групі унікальний номер від 1 до n, і для кожного рядка повертає номер його групи.[14]

Примітки

  1. Celko, 2015, с. 479—483.
  2. Celko, 2015, с. 479.
  3. Celko, 2015, с. 480.
  4. Celko, 2015, с. 480—481.
  5. Celko, 2015, с. 482—483.
  6. Celko, 2015, с. 483—484.
  7. Ranking Functions (Transact-SQL). Microsoft Learn. 8 жовтня 2023. Архів оригіналу за 17 червня 2024.
  8. а б в Celko, 2015, с. 484.
  9. Silberschatz, F. Korth та Sudarshan, 2020, с. 219.
  10. Celko, 2015, с. 484—485.
  11. Silberschatz, F. Korth та Sudarshan, 2020, с. 220.
  12. а б Celko, 2015, с. 485—486.
  13. а б Silberschatz, F. Korth та Sudarshan, 2020, с. 221.
  14. Silberschatz, F. Korth та Sudarshan, 2020, с. 223.

Література

  • Silberschatz, Abraham; F. Korth, Henry; Sudarshan, S. (2020). Database System Concepts (вид. 7). New York: McGraw-Hill Higher Education. с. 1376. ISBN 978-0078022159.
  • Celko, Joe (2015). SQL for Smarties: Advanced SQL Programming (вид. 5). Morgan Kaufmann. с. 852. ISBN 978-0-12-800761-7.
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya