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

LAST_VALUE

Бере значення з останнього рядка вікна — але лише з правильною рамкою.

Синтаксис

LAST_VALUE(<вираз>) OVER (
  ORDER BY <критерій>
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)

LAST_VALUE(<вираз>) OVER (
  PARTITION BY <група> ORDER BY <критерій>
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)

Кожному рядку додає значення з останнього рядка його вікна. Головна особливість — рамка: за замовчуванням вікно закінчується на поточному рядку, тож без ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING «останнім» буде сам поточний рядок. Дзеркальна функція — FIRST_VALUE.

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

employees

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

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

Найменша зарплата поруч з кожною
SELECT name, salary,
LAST_VALUE(salary) OVER (
ORDER BY salary DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lowest
FROM employees;
namesalarylowest
Olivia1350950
Emma1200950
Sophia1200950
Liam1000950
Noah950950
З рамкою і безСкладніше
SELECT name, salary,
LAST_VALUE(salary) OVER (ORDER BY salary DESC) AS without_frame,
LAST_VALUE(salary) OVER (
ORDER BY salary DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lowest
FROM employees;
namesalarywithout_framelowest
Olivia13501350950
Emma12001200950
Sophia12001200950
Liam10001000950
Noah950950950

Без рамки вікно закінчується на поточному рядку, тож without_frame просто повторює зарплату. З повною рамкою LAST_VALUE бачить усі рядки й повертає найменшу — 950.

Хто заробляє найменше у відділі
SELECT name, department, salary,
LAST_VALUE(name) OVER (
PARTITION BY department ORDER BY salary DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lowest_paid
FROM employees;
namedepartmentsalarylowest_paid
Emmabackend1200Liam
Liambackend1000Liam
Sophiadesign1200Sophia
Oliviafrontend1350Noah
Noahfrontend950Noah

Зверни увагу

Без рамки LAST_VALUE майже завжди повертає поточне значення: вікно закінчується на поточному рядку. Додай ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

Часто простіше обійтися без рамки: FIRST_VALUE(salary) OVER (ORDER BY salary) дає те саме, що LAST_VALUE з повною рамкою й порядком DESC.

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

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

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