Функция Postgresql Lag () используется для доступа к строке в таблице, которая находится перед текущей строкой таблицы. Как видно из названия, он отстает от текущей строки и принимает запись таблицы. В PostgreSQL функция задержки важна, так как она сравнивает предыдущие строки с текущей строкой.
Эта функция подходит для получения информации о данных, которые вы ввели ранее, но присутствуют в текущей строке. Тогда вы сможете получить доступ к данным прошлого. Откройте psql и, указав пароль, теперь можете применять все команды в оболочке psql.
Синтаксис
LAG(expression [ offset [value]])
OVER (
[PARTITION BY expression, … ]
ORDER BY expression [ASC | DESC], …
)
Смещение — это целое число, заданное в запросе, которое показывает количество строк, присутствующих над текущей строкой. Это может быть подзапрос или выражение.Реклама закончится через 11
Функция задержки применяется к разделу значений, который в основном создается с помощью предложения раздела. В то же время предложение order by используется для упорядочивания строк в указанном порядке.
Мы описали здесь две основные особенности функции задержки:
- Задержка раздела по умолчанию
- Функция лага в разделах.
lag default partition
У нас есть таблица с названием «выставочный зал», содержащая подробную информацию об автомобилях. Таблица создается запросом «CREATE TABLE» в psql и добавлением данных с помощью оператора «INSERT».
>> select * from showroom;
Мы применим к таблице функцию запаздывания. Функция lag содержит два или более оператора select. Поскольку мы должны выбрать значение перед текущей строкой, текущая строка выбирается на первом шаге, а затем строка перед ней.
Пример 1
В этом примере мы выберем столбец из таблицы и вычислим сумму из столбца цен. Второй оператор выбора будет использовать функцию задержки. Оба этих оператора используют предложение «упорядочить по» с «группировать по» в агрегированной функции select. Поскольку ни один год не похож на другой, будут отображаться все строки. Группировки не будет. Теперь применяем команду к таблице:
>> with cte AS ( SELECT year, SUM (price) price FROM showroom GROUP BY year ORDER BY year ) SELECT year, price, LAG (price, 1) OVER (ORDER BY year) previous_year_discount from cte;
Чтобы напечатать значение строки над текущей строкой, мы сначала получаем доступ к текущей строке с помощью оператора select и вычислили функцию суммы. Полученное значение сохраняется в «cte» для дальнейшего использования в последнем запросе. Полученное значение будет отсортировано и сгруппировано по столбцу «год».
При переходе ко второму оператору select из таблицы выбираются те же столбцы в «cte». Создается дополнительный столбец с именем «предыдущая_годовая скидка», имеющий отставание на 1 строку. И строки результирующего столбца должны быть упорядочены по столбцу года.
Из полученной таблицы видно, что первая строка в новом столбце пуста. Потому что цена смещается на следующую строку с самого начала, делая первую строку NULL.
Пример 2
Другой пример; здесь мы используем три оператора выбора. «Cte» и «cye» используются для хранения значений, полученных из двух запросов с использованием оператора «select», а их результирующие значения будут использоваться в третьем операторе выбора. Вывод «cte» действует как вывод «cte2». Точно так же «cte2» будет входом для третьего оператора выбора. Все значения отображаются в итоговой таблице вместе, потому что один результат является функцией запаздывания, тогда как второй результирующий столбец показывает разницу между двумя значениями запаздывания.
При переходе к первому «cte» вычисляется та же функция, что и в предыдущем примере. Сумма рассчитывается из столбца «цена».
>> With cte AS ( SELECT year, SUM (price) price FROM showroom GROUP BY year ORDER BY year ),
Вторая команда «cte2» похожа на вторую команду выбора, потому что мы знаем, что функция задержки применяется к сумме столбца «цена». Столбец этой суммы «previous_year_Discount» сохраняется как в cte.
>> cte2 AS ( SELECT year, price, LAG (price, 1) OVER (ORDER BY year) previous_year_discount from cte)
Третья инструкция «select» возьмет запаздывающую сумму цен и вычислит их разницу. Например, цена в третьей строке вычитает значение из второй строки. В то же время первая строка имеет значение NULL из-за функции задержки.
>> SELECT year, price, previous_year_Discount, (Previous_year_Discount – price) Difference FROM cte;
Четвертый столбец назван разницей, потому что он использует оператор минус для вычитания значений в третьем столбце.
Для каждой строки значение из 3-го столбца вычитается из предыдущей строки. Например (3–2), (4–3) и так далее. И вычитаемое значение записывается перед первым значением (вычитается из следующего значения). Но в 6-й, последней строке в столбце «Разница» написан ответ, который получается вычитанием 1-й строки из 2-й строки, значения 2021 года.
Пример 3
Рассмотрим другой пример, в котором та же концепция применяется к таблице. Но отставание 2 вместо единицы. Единственный оператор выбора отображает цены, а не СУММ или любую другую агрегатную функцию.
>> SELECT year, price, LAG (price, 2) OVER (ORDER BY year) Discount FROM showroom;
Полученное значение показывает, что цена в столбце скидки сдвинута на две строки вниз. Это означает, что мы получили доступ к строкам перед текущей строкой таблицы.
Функция LAg в разделах
Через pgAdmin
В pgAdmin после ввода пароля вы можете получить доступ к базе данных и всему содержимому, присутствующему в ней. Перейдите к инструменту запроса таблиц. Теперь создайте новые имена таблиц «team_members».
>> CREATE TABLE team_members ( name VARCHAR(100), id INT, year integer, salary integer);
После создания таблицы добавьте значения в таблицу.
>> INSERT INTO team_members( name, id, year, salary) Values (‘salar’, 1, 2018, 180000);
После того, как значения вставлены, примените запрос.
Функция LAG () в этом типе сравнивает годовую зарплату с прошлым годом каждой группы.
>> select year, salary, id, LAG(salary, 1) over partition by id ( order by year ) Discount FROM team_members;
В этом примере идентификаторы сгруппированы вместе. Раздел распределяет строки по группе, так как вы можете видеть, что все одинаковые идентификаторы присутствуют вместе. А в столбце скидок показано сравнение зарплаты в одной строке со второй строкой с лагом 1.
Заключение
«Функция задержки» используется для извлечения записи, которую вы ввели перед текущей выбранной строкой. Здесь с примерами обсуждаются две основные категории функции задержки. Select, order by используются в дополнение к разделу «partition by clause». Эту функцию в PostgreSQL можно применять внутри таблицы, а затем применять к ним различные операции.