Описание: в этой статье вы узнаете, как использовать функцию LAST_VALUE() в MySQL для возврата последней строки в упорядоченном наборе строк.
Функция LAST_VALUE() является оконной функцией, что позволяет выбрать последнюю строку в упорядоченном наборе строк.
Ниже показан синтаксис функции LAST_VALUE():
LAST_VALUE (expression) OVER ( [partition_clause] [order_clause] [frame_clause] )
Функция LAST_VALUE() возвращает значение expression из последней строки отсортированного набора строк.
Пункт OVER имеет три положения: partition_clause, order_clause и frame_clause.
partition_clause имеет следующий синтаксис:
PARTITION BY expr1, expr2, ...
Раздел PARTITION BY распределяет наборы результатов на несколько разделов , указанных одного или более выражений expr1, expr2 и т.д. Функция LAST_VALUE() применяется к каждой секции независимо друг от друга.
order_clause имеет следующий синтаксис:
ORDER BY expr1 [ASC|DESC],...
Предложение ORDER BY определяет логические порядки строк в разделах, где применяется функция LAST_VALUE().
В frame_clause определяет подмножество текущего раздела, к которому применяется функция LAST_VALUE(). Для более подробной информации frame_clause, пожалуйста, ознакомьтесь с руководством по оконным функциям.
Давайте настроим образец таблицы для демонстрации.
Ниже приведен сценарий для создания таблицы overtime и внесения данных в таблицу.
CREATE TABLE overtime ( employee_name VARCHAR(50) NOT NULL, department VARCHAR(50) NOT NULL, hours INT NOT NULL, PRIMARY KEY (employee_name , department) ); INSERT INTO overtime(employee_name, department, hours) VALUES('Anna An','Accounting',43), ('AndreyEx Le','Accounting',89), ('Maria Mr','Accounting',55), ('Anatolyi Ba','Finance',34), ('Alex Av','Finance',54), ('Max Oh','Finance',33), ('Andrey Da','IT',68),
Следующий оператор получает имя сотрудника, сверхурочную работу и сотрудника, который имеет наибольшее сверхурочное время:
SELECT employee_name, hours, LAST_VALUE(employee_name) OVER ( ORDER BY hours RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) highest_overtime_employee FROM overtime;
В этом примере в предложении ORDER BY указан логический порядок строк в наборе результатов по часам от низкого до высокого.
Спецификация фрейма по умолчанию следующая:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Это означает, что кадр начинается в первой строке и заканчивается в текущей строке набора результатов.
Поэтому, чтобы получить сотрудника с самым высоким сверхурочным временем, мы изменили спецификацию фрейма на следующую:
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
Это означает, что кадр начинается в первой строке и заканчивается в последней строке набора результатов.
Следующее утверждение находит сотрудника, который имеет самые высокие сверхурочные в каждом отделе:
SELECT employee_name, department, hours, LAST_VALUE(employee_name) OVER ( PARTITION BY department ORDER BY hours RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) most_overtime_employee FROM overtime;
В этом примере, во-первых, предложение PARTITION BY разделило сотрудников по отделам. Затем предложение ORDER BY сортирует сотрудников в каждом отделе сверхурочно от низкого до высокого.
Спецификация фрейма в этом случае – это весь раздел. В результате функция LAST_VALUE() выбрала последнюю строку в каждом разделе, в которой был сотрудник с наибольшим временем сверхурочной работы.
Из этой статьи вы узнали, как использовать функцию LAST_VALUE() в MySQL для получения последней строки в упорядоченном наборе строк.