Создание нового поля даты динамично от следующей строки

У меня есть таблица данных. У меня есть поле, которое показывает дату. Я установил этот столбец как Дату начала. Я хочу создать дополнительный столбец как Дату окончания, где Датой окончания будет Дата начала следующей строки. Можно ли дать мне запрос создания Даты окончания путем взятия данных Даты начала в следующей строке?

0
задан Sreejesh Kumar 29 July 2010 в 17:52
поделиться

5 ответов

Предполагая, что у вас уже есть столбцы и у вас есть автоинкрементный первичный ключ:

Update T1
Set T1.EndDate = T2.StartDate
From [Table] T1
Inner Join [Table] T2 on T1.Id = T2.Id - 1
1
ответ дан 4 September 2019 в 00:48
поделиться

Я предполагаю, что в настоящее время у вас есть строки со значениями типа

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
2
ответ дан 4 September 2019 в 00:48
поделиться

Зависит от того, что вы подразумеваете под «следующей» строкой.

Можете ли вы предоставить образец набора данных и указать, как вы определяете порядок расположения строк?

РЕДАКТИРОВАТЬ

Ваш порядок записей действительно имеет значение - вам нужно будет определить, что это такое. На данный момент я отрабатываю предположение, что заказ по 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
1
ответ дан 4 September 2019 в 00:48
поделиться

А как насчет последней строки? Для этого endDate будет пустым?

0
ответ дан 4 September 2019 в 00:48
поделиться

Прежде всего, необходимо придумать определение "порядка", поскольку строки в таблице хранятся без какого-либо порядка.

Когда вы знаете, что такое порядок, вы можете создать хранимую процедуру, которая будет выглядеть так:

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>;
2
ответ дан 4 September 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: