MySQL версии 8.0 представил оконные функции MySQL, позволяющие выполнять запросы более простым и организованным методом. Тем самым увеличивая обработку и производительность. К таким функциям относятся: RANK(), ROW_RANK(), LAST_VALUE() и многие другие.
В этом руководстве мы сосредоточимся на использовании одной из функций MySQL: LAG(). Это оконная функция, которая позволяет вам получать доступ и извлекать значения предыдущих строк из текущей строки в том же наборе результатов.
Общий синтаксис использования функции MySQL LAG():
LAG(Expression, OffSetValue, DefaultVar) OVER ( PARTITION BY [Expression] ORDER BY Expression [ASC|DESC] );
Давайте уделим время объяснению некоторых параметров синтаксиса функции LAG().
Вот они:
Expression: это значение, возвращаемое функцией из строки, которая опережает текущую строку на указанное значение смещения.
OffSetValue: это значение представляет количество строк, предшествующих текущей строке, из которой следует получить значение. Это значение должно быть 0 или больше 0.
DefaultVar: это значение возвращается функцией как значение по умолчанию, если предыдущая строка не существует. Если значение по умолчанию в параметре функции не определено и предыдущая строка не существует, функция возвращает значение NULL.
PARTITION BY: Предложение PARTITION BY разделяет строки в наборе логических разделов. Затем к разделенным разделам применяется функция LAG.
ORDER BY: как обычно, это значение определяет порядок строк в доступных разделах.
Давайте посмотрим на примеры использования функции LAG(), чтобы понять, как она работает. Начните с создания образца базы данных с именем sample_db;
DROP DATABASE IF EXISTS sample_database; CREATE DATABASE sample_database; USE sample_database; DROP TABLE IF EXISTS users; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), Score INT, Enroll_Date DATE ); INSERT INTO users(id, name, score, enroll_date) VALUES (1, "Alexandra", 99, '2021-01-10'), (2, "Jacob", 81, '2021-05-20'), (3, "Leonard", 67, '2020-01-02'), (4, "Peter", 88, '2021-03-03'), (5, "Amy", 100, '2021-05-05'); SELECT * FROM users;
Теперь, когда у нас есть образец базы данных для работы, мы можем продолжить и проиллюстрировать, как работать с функцией MySQL LAG.
Пример 1. Функция задержки без значения по умолчанию.
Рассмотрим приведенный ниже пример, в котором функция задержки применяется к Enroll_Date со значением смещения 1.
SELECT *, LAG(Enroll_Date, 1) OVER ( ORDER BY id ASC) as previous_date FROM sample_database.users;
После выполнения вышеуказанного запроса мы получаем новый столбец previous_date, содержащий предыдущее значение строки, как указано со значением смещения 1. Поскольку в первой строке нет предыдущего значения, значение равно нулю.
Пример 2: Функция задержки со значением по умолчанию
Вы также можете указать значение по умолчанию для строки, в которой предыдущее значение не существует. В нашем примере мы установим значение по умолчанию для текущей даты.
Рассмотрим запрос ниже:
SELECT *, LAG(Enroll_Date, 2, CURDATE()) OVER ( ORDER BY id ASC) as previous_date FROM sample_database.users;
После выполнения вышеуказанного запроса мы получим значения со значением смещения, равным двум, и текущей датой по умолчанию для нулевых значений.
Пример 3: Функция задержки с помощью Partition by
Мы можем использовать функцию LAG() с разделом по условию. Это предложение сначала группирует данные в различные логические подмножества, а затем применяет функцию задержки к разделам.
Прежде чем продолжить, давайте посмотрим данные в таблице пользователя. Рассмотрим следующий запрос:
INSERT INTO users(id, name, score, enroll_date) VALUES (1, "Alexandra", 99, '2021-01-10'), (2, "Jacob", 81, '2021-05-20'), (3, "Leonard", 67, '2020-01-02'), (4, "Peter", 88, '2021-03-03'), (5, "Amy", 100, '2021-05-05'), (6, "Tobias", 100, '2020-06-06'), (7, "Kurtzman", 67, '2020-07-10'), (8, "Immortal", 50, '2021-03-01'), (9, "Anthony", 81, '2021-01-01'), (10, "James", 77, '2021-02-03');
Теперь, когда у нас есть таблица с 10 значениями, мы можем разделить данные по счету, а затем применить функцию задержки.
Вышеупомянутая операция проиллюстрирована в запросе ниже:
SELECT *, LAG(Enroll_date, 1, CURDATE()) OVER (PARTITION BY score ORDER BY id ASC) AS previous_date FROM sample_database.users;
В приведенном выше запросе мы начинаем с разделения данных на основе оценки, а затем применяем функцию задержки со значением смещения 1. Мы также устанавливаем значение по умолчанию как текущую дату.
В этой статье обсуждалось, как функция LAG() работает для получения значений предыдущих строк в текущей строке.
Резюмируем: