Віконна функція (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]
- ↑ Celko, 2015, pp. 479—483.
- ↑ Celko, 2015, p. 479.
- ↑ Celko, 2015, p. 480.
- ↑ Celko, 2015, pp. 480—481.
- ↑ Celko, 2015, pp. 482—483.
- ↑ Celko, 2015, pp. 483—484.
- ↑ Ranking Functions (Transact-SQL). Microsoft Learn. 8 жовтня 2023. Архів оригіналу за 17 червня 2024.
- ↑ а б в Celko, 2015, p. 484.
- ↑ Silberschatz, F. Korth та Sudarshan, 2020, p. 219.
- ↑ Celko, 2015, pp. 484—485.
- ↑ Silberschatz, F. Korth та Sudarshan, 2020, p. 220.
- ↑ а б Celko, 2015, pp. 485—486.
- ↑ а б Silberschatz, F. Korth та Sudarshan, 2020, p. 221.
- ↑ 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.