#sql #oracle #date
#sql #Oracle #Дата
Вопрос:
Цель: определить записи, в которых разница в дате вступления в силу между 2 транзакциями превышает 365 дней.
Пример таблицы:
account# Effective_Date
1234 01/01/2020
1234 02/01/2020
1234 03/01/2020
1234 04/01/2021
Я хотел бы создать таблицу, которая будет выглядеть следующим образом
account Effective_Date Effective_Date_1 Calculate_Days
1234 01/01/2020 0
1234 02/01/2020 01/01/2020 31
1234 03/01/2020 02/01/2020 29
1234 04/01/2021 03/01/2020 395
цель 1: дублировать дату вступления в силу в другом столбце «effective_date_1»
цель 2: смещение «effective_date_1» на 1 строку
возможно ли это в SQL?
Комментарии:
1. Да, это так. Какую СУБД вы используете? Это очень просто в современных СУБД, которые имеют
LAG
функцию.2. Используйте
LAG()
функцию.3. Пожалуйста, пометьте свой вопрос базой данных, которую вы используете: mysql, oracle, sqlserver …?
Ответ №1:
Использовать lag()
. В SQL Server это выглядит так:
select t.*,
datediff(day, lag(effective_date), effective_date) as num_days
from t;
Примечание: это возвращает NULL
для первой строки. Если вы действительно хотите 0
, то форма с 3 аргументами удобна:
select t.*,
datediff(day, lag(effective_date, 1, effective_date), effective_date) as num_days
from t;
Ответ №2:
оператор lag должен использовать с over() и order by в нем.
select t.*
,lag(Effective_Date) over(order by Effective_Date)
,datediff(day, lag(Effective_Date) over(order by Effective_Date) , Effective_Date)
from (
select 1234 as account# ,'01/01/2020' as Effective_Date
union
select 1234 as account# ,'02/01/2020' as Effective_Date
union
select 1234 as account# ,'03/01/2020' as Effective_Date
union
select 1234 as account# ,'04/01/2021' as Effective_Date
) t