У меня есть таблица данных. У меня есть поле, которое показывает дату. Я установил этот столбец как Дату начала. Я хочу создать дополнительный столбец как Дату окончания, где Датой окончания будет Дата начала следующей строки. Можно ли дать мне запрос создания Даты окончания путем взятия данных Даты начала в следующей строке?
Предполагая, что у вас уже есть столбцы и у вас есть автоинкрементный первичный ключ:
Update T1
Set T1.EndDate = T2.StartDate
From [Table] T1
Inner Join [Table] T2 on T1.Id = T2.Id - 1
Я предполагаю, что в настоящее время у вас есть строки со значениями типа
StartDate
---------
1 Jan 1990
2 June 1998
4 September 2006
И вы хотите изменить их на
StartDate EndDate
--------- ------------
1 Jan 1990 2 June 1998
2 June 1998 4 September 2006
4 September 2006 NULL
Помимо избыточности и проблемы обслуживания, это напоминает мне этот вопрос, где такая настройка с коррелированными столбцами фактически вызвала проблемы у первоначального автора при запросе данных. (Мне больше нравится ответ Unreason, чем мой собственный по этому вопросу!)
Зачем вам нужно добавлять колонку EndDate
? Вероятно, можно придумать запрос, который работает без него.
Edit После долгого возиться с row_number()
я не смог найти запрос с лучшим планом, чем этот. (Предполагается индекс на StartDate
)
SELECT
id,
StartDate,
(SELECT MIN(StartDate)
FROM testTable t2
WHERE t2.StartDate > t1.StartDate) AS EndDate
FROM testTable t1
Зависит от того, что вы подразумеваете под «следующей» строкой.
Можете ли вы предоставить образец набора данных и указать, как вы определяете порядок расположения строк?
РЕДАКТИРОВАТЬ
Ваш порядок записей действительно имеет значение - вам нужно будет определить, что это такое. На данный момент я отрабатываю предположение, что заказ по start_date приемлем.
--GET the first relevant start date
declare @start datetime
set @start = select MIN(start_date) from table
declare @end datetime
set @end = @start
WHILE @end is not null
--GET the next relevant end date
SET @end = select MIN(start_date) from table where start_date > @start
--Update the table with the end date
UPDATE table
SET end_date = @end
WHERE start_date = @start
--GET the next relevant start date
SET @start = @end
END
А как насчет последней строки? Для этого endDate будет пустым?
Прежде всего, необходимо придумать определение "порядка", поскольку строки в таблице хранятся без какого-либо порядка.
Когда вы знаете, что такое порядок, вы можете создать хранимую процедуру, которая будет выглядеть так:
insert into the_table (new_id, start_date) values (@id, @start_date);
update the_table
set end_date = @start_date
where id = <the id determined by your sorting rule>;