2015-12-28 2 views
2

Я ищу несколько советов о том, какой тип обновления был бы лучшим в определенном сценарии для t-sql DML.T-SQL Обновление текущей строки до значения следующей строки

пришел в вопросе данных, где конечные даты один день до даты начала на текущей записи, и необходимо установить дату окончания на дату начала следующего в строке для нескольких объектов

Например

rowid  entity id record_type start_date end_date 
214  250  1 H   2015-01-01 2014-12-31 
329  250  1 H   2015-04-25 2015-04-24 
533  250  1 C   2015-11-01 NULL 
11  250  2 H   2015-06-01 2014-05-29 
292  250  2 H   2015-09-11 2015-09-10 
987  250  2 C   2015-10-01 NULL 

Что мне нужно сделать, это обновить первую запись END_DATE к следующей записи StartDate - 1 на каждый сотрудник/организации.

В настоящее время существует более 5 тыс. Сущностей, подверженных этому, поэтому я пытаюсь как можно быстрее обновить эту запись на каждой записи, чтобы сэкономить время на этом.

Что я могу сделать, но отнимающее много времени, чтобы 1. получить максимальную сверку записей истории для всех компаний в один ряд 2. создать такое же количество временных таблиц для подсчета общих числа строк 3. Вставить минимальные значения даты начала в первую таблицу темпа 4. вставить минимальное значение не в таблицу темп 1 в таблицу 2 и т. Д. 5. затем обновить дату окончания временной таблицы 1 до начальной затеи 2 дня -1 день 6. оттуда, запустите обновление в фактической таблице с несколькими операциями обновления для каждой таблицы temp, объединенной в rowid.

Окончательный результат будет выглядеть следующим образом:

rowid  entity id record_type start_date end_date 
214  250  1 H   2015-01-01 2014-04-24 
329  250  1 H   2015-04-25 2015-10-31 
533  250  1 C   2015-11-01 NULL 
11  250  2 H   2015-06-01 2014-09-10 
292  250  2 H   2015-09-11 2015-9-31 
987  250  2 C   2015-10-01 NULL 

Любые предложения, кроме моего длинного списка временных таблиц/обновления будет весьма признателен! Я думал что-то вроде линии курсора, но я не уверен, будет ли это более быстрый способ написать обновление для этого сценария.

+0

Используйте [автообъединение] (http://www.tutorialspoint.com/sql/sql-self-joins.htm) с 'LAG()' функция. –

+0

Совет. Полезно пометить вопросы базы данных как с помощью соответствующего программного обеспечения (MySQL, Oracle, DB2, ...) и версии, например. 'SQL-сервер-2014'. Различия в синтаксисе и особенностях часто влияют на ответы. – HABO

ответ

2

Я думаю, что обновляемые CTE - это путь. В SQL Server 2012+, вы можете использовать lead():

with toupdate as (
     select t.*, 
      lead(start_date) over (partition by entity order by start_date) as next_start_date 
     from t 
    ) 
update toupdate 
    set end_date = dateadd(day, -1, next_start_date) 
    where end_date = dateadd(day, -1, start_date); 
+0

Это прекрасно, спасибо. – Jberrong

+0

Это отличный и правильный ответ. Однако некоторые и «àà! È» решили, что серверы 2008R2 будут размещаться и жить, пока сервер-разработчик 2016 года. Кто-нибудь может помочь мне с решением, которое будет работать в 2008R2 –

Смежные вопросы