Віконністандарт SQL

FIRST_VALUE

Бере значення з першого рядка вікна.

Синтаксис

FIRST_VALUE(<вираз>) OVER (ORDER BY <критерій>)
FIRST_VALUE(<вираз>) OVER (PARTITION BY <група> ORDER BY <критерій>)

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

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Найбільша зарплата поруч з кожною
SELECT name, salary,
FIRST_VALUE(salary) OVER (ORDER BY salary DESC) AS top_salary
FROM employees;
namesalarytop_salary
Olivia13501350
Emma12001350
Sophia12001350
Liam10001350
Noah9501350
Лідер кожного відділу
SELECT name, department, salary,
FIRST_VALUE(name) OVER (PARTITION BY department ORDER BY salary DESC) AS leader
FROM employees;
namedepartmentsalaryleader
Emmabackend1200Emma
Liambackend1000Emma
Sophiadesign1200Sophia
Oliviafrontend1350Olivia
Noahfrontend950Olivia
Скільки бракує до найбільшої зарплати
SELECT name, salary,
FIRST_VALUE(salary) OVER (ORDER BY salary DESC) - salary AS gap_to_top
FROM employees;
namesalarygap_to_top
Olivia13500
Emma1200150
Sophia1200150
Liam1000350
Noah950400

Зверни увагу

При рівних значеннях «першим» може стати будь-хто з рівних. Потрібен стабільний результат — додай до ORDER BY унікальне поле.

На відміну від LAST_VALUE, рамка вікна тут не заважає: вікно завжди починається з першого рядка. Тож і «останнє» значення простіше взяти як FIRST_VALUE з оберненим порядком.

Використати результат у WHERE того самого запиту не можна — спершу порахуй його в підзапиті, а фільтруй уже зовні.

Схожі функції

Детально в курсі