Skip to content

Функції вікон SQL пояснені

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

Функція вікна обчислює результат по рядах, пов'язаних із поточним рядком, не згортаючи їх так, як це робить GROUP BY. Кожна функція вікна завершується реченням OVER, яке визначає вікно: PARTITION BY групує рядки, ORDER BY упорядковує їх, а необов'язковий кадр обмежує ковзну множину. Опануйте OVER — решта це лише словник.

Довідкова таблиця · 27 записи
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)