У меня есть выборка данных следующим образом:
start_date end_date amount
12/10/2020 - 1800000
12/18/2020 - 1200000
01/18/2021 - 1000000
Я хотел бы напечатать дату начала второй строки до даты окончания первой строки для X строк, которые я извлекаю, чтобы таблица выглядела следующим образом:
start_date end_date amount
12/10/2020 12/18/2020 1800000
12/18/2020 01/18/2021 1200000
01/18/2021 - 1000000
Всем спасибо!
Это работает отлично! Я решил это с помощью функции LAG и предложения over! Большое спасибо!
Используйте LEAD следующим образом:
select start_Date,
lead(start_date) over (order by start_Date) as end_Date
amount
from your_Table t
При этом ордер end_date не выбирается должным образом, это делается следующим образом: start_date end_date сумма 10.12.2020 18.12.2020 1800000 18.12.2020 - 1200000 18.01.2021 10.12.2020 1000000 Для второго и третьего ряда это делается неправильно, для первого только правильно.
Является ли start_Date датой?
Исправлено при использовании реальной даты вместо конвертированной в nvarchar. Спасибо за совет!!
Используйте ведущий, если у вас нет столбца для разделения, используйте только порядок в over()
select start_date,
lead(start_date) over (partition by ... order by start_date) as end_date,
amount
...
При этом ордер end_date не выбирается должным образом, это делается следующим образом: start_date end_date сумма 10.12.2020 18.12.2020 1800000 18.12.2020 - 1200000 18.01.2021 10.12.2020 1000000 Для второго и третьего ряда это делается неправильно, для первого только правильно.
Та же проблема, даты подтягиваются не туда
Исправлено при использовании реальной даты вместо конвертированной в nvarchar.
Использовал образец таблицы и выбрал данные. Пожалуйста, измените запрос SQL в соответствии с вашими потребностями.
DECLARE @Range TABLE (
start_date DATETIME
,end_date DATETIME
,amount INT
)
INSERT @Range
SELECT '12/10/2020'
,NULL
,1800000
UNION ALL
SELECT '12/18/2020'
,NULL
,1200000
UNION ALL
SELECT '01/18/2021'
,NULL
,1000000
SELECT start_date
,LEAD(start_date, 1) OVER (
ORDER BY start_date
) AS end_date
,amount
FROM @Range;
Еще один вариант LEAD с использованием рекурсивного CTE.
DECLARE @T TABLE(start_date DATE, end_date DATE, amount INT)
Insert into @T VALUES
('12/10/2020',NULL,1800000),
('12/18/2020',NULL,1200000),
('01/18/2021',NULL,1000000)
;WITH CTE AS(
SELECT rownum = ROW_NUMBER() OVER(ORDER BY End_Date),amount,Start_Date,End_Date
FROM @T
)
SELECT
CTE.start_date,CTE.amount,Nex.start_date AS[End Date]
FROM CTE
LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
LEFT JOIN CTE nex ON nex.rownum = CTE.rownum + 1
Посмотрите на LAG/LEAD.