Усі поширені функції вікон SQL і речення, які ними керують, згруповані за завданнями: ранжування рядків, погляд на сусідів, нарощувані суми в межах кадру та отримання перших або останніх значень. Кожен рядок поєднує функцію з однорядковим прикладом.
Функція вікна обчислює результат по рядах, пов'язаних із поточним рядком, не згортаючи їх так, як це робить GROUP BY. Кожна функція вікна завершується реченням OVER, яке визначає вікно: PARTITION BY групує рядки, ORDER BY упорядковує їх, а необов'язковий кадр обмежує ковзну множину. Опануйте OVER — решта це лише словник.
Довідкова таблиця · 27 записи
Функції вікон SQLExplained
27 of 27 rows
Ранжування
Унікальне послідовне ціле число для кожного рядка в межах вікна.
ROW_NUMBER() OVER (ORDER BY total DESC)
Ранг із пропусками; рівні ділять один ранг, а наступні номери пропускаються.
RANK() OVER (ORDER BY total DESC)
Ранг без пропусків; рівні ділять один ранг, і нічого не пропускається.
DENSE_RANK() OVER (ORDER BY total DESC)
Розбиває впорядковане вікно на n приблизно рівних кошиків.
NTILE(4) OVER (ORDER BY total DESC)
Погляд на сусідів
Значення на n рядків назад; якщо такого рядка немає, підставляється значення за замовчуванням.
LAG(total, 1, 0) OVER (ORDER BY created_at)
Значення на n рядків уперед; якщо такого рядка немає, підставляється значення за замовчуванням.
LEAD(total, 1, 0) OVER (ORDER BY created_at)
Агрегація по вікну
Нарощувана або за розділами сума без згортання рядків.
SUM(total) OVER (ORDER BY created_at)
Нарощуване або за розділами середнє.
AVG(total) OVER (PARTITION BY user_id)
Нарощувана або за розділами кількість рядків.
COUNT(*) OVER (PARTITION BY user_id)
Найменше значення по вікну або розділу.
MIN(total) OVER (PARTITION BY user_id)
Найбільше значення по вікну або розділу.
MAX(total) OVER (PARTITION BY user_id)
SUM з ORDER BY і кадром, відкритим від початку; кожен рядок сумує все до самого себе.
SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG по кадру з n рядків до і після поточного рядка.
AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Перше, останнє та процентилі
Перше значення в порядку сортування вікна.
FIRST_VALUE(total) OVER (ORDER BY total DESC)
Останнє значення в кадрі; без UNBOUNDED FOLLOWING кадр зупиняється на поточному рядку.
LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Значення в n-му рядку порядку сортування вікна.
NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Відносний ранг рядка, від 0 до 1.
PERCENT_RANK() OVER (ORDER BY total)
Частка рядків до поточного рядка включно, від 1/n до 1.
CUME_DIST() OVER (ORDER BY total)
Речення OVER
Визначає вікно, яке читає кожна функція.
<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Перезапускає вікно для кожної групи рядків.
PARTITION BY user_id
Упорядковує рядки всередині кожного розділу.
ORDER BY created_at
Обмежує ковзний кадр, напр. від попередніх рядків до наступних.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Обмежує кадр значеннями, а не позиціями рядків; CURRENT ROW охоплює рівних сусідів, і це типовий кадр за наявності ORDER BY.
RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Обмежує кадр групами рівних рядків із ORDER BY.
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Видаляє поточний рядок із кадру; натомість EXCLUDE TIES видаляє його рівних сусідів.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Дає вікну ім'я один раз на запит, щоб кілька речень OVER могли його повторно використати.
WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Звужує рядки, які читає агрегатна функція вікна, до застосування вікна.
SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)