Перейти до вмісту

Віконна функція (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 function[7] або англ. ordinal function) повертає певний порядковий номер рядка у вікні. Щоб отримати змістовний результат обчислення такої функції, потрібно задати певний порядок у вікні через 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, pp. 479—483.
  2. Celko, 2015, p. 479.
  3. Celko, 2015, p. 480.
  4. Celko, 2015, pp. 480—481.
  5. Celko, 2015, pp. 482—483.
  6. Celko, 2015, pp. 483—484.
  7. Ranking Functions (Transact-SQL). Microsoft Learn. 8 жовтня 2023. Архів оригіналу за 17 червня 2024.
  8. а б в Celko, 2015, p. 484.
  9. Silberschatz, F. Korth та Sudarshan, 2020, p. 219.
  10. Celko, 2015, pp. 484—485.
  11. Silberschatz, F. Korth та Sudarshan, 2020, p. 220.
  12. а б Celko, 2015, pp. 485—486.
  13. а б Silberschatz, F. Korth та Sudarshan, 2020, p. 221.
  14. Silberschatz, F. Korth та Sudarshan, 2020, p. 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.