Первый шаг - создать резервную копию:
select *
into t_resourcetable_backup20120327
from t_resourcetable
Затем обновите конечную дату для первых записей, сгруппированных по resNo и subRes:
update t_resourcetable
set enddate = (select max (enddate)
from t_resourcetable t1
where t1.resNo = t_resourcetable.resNo
and t1.subRes = t_resourcetable.subRes)
where not exists (select null
from t_resourcetable t1
where t1.resNo = t_resourcetable.resNo
and t1.subRes = t_resourcetable.subRes
and t1.startdate < t_resourcetable.startdate)
И, наконец, удалить лишние записи:
delete t_resourcetable
where exists (select null
from t_resourcetable t1
where t1.resNo = t_resourcetable.resNo
and t1.subRes = t_resourcetable.subRes
and t1.startdate < t_resourcetable.startdate)
Это оставит дубликаты, если у вас есть дубликаты начальных дат для уникальной комбинации resNo и subRes. Вы также должны проверить, всегда ли у конечных дат есть соответствующие начальные даты, потому что вы потеряете пробелы - но это может быть просто то, что вам нужно.
Помимо создания резервной копии, вы можете обернуть обновление / удаление в транзакции, сделать выбор после удаления и откат, затем проверить данные в Excel и, если все выглядит нормально, повторить транзакцию, но зафиксировать ее на этот раз.
ОБНОВЛЕНИЕ: этот запрос выявляет пробелы. Если вы используете Sql Server 2000, преобразуйте CTE в производные таблицы. Сначала возвращает список ресурсов, не имеющих предшественников, последний делает то же самое для наследников. Оба считают пробелы. Затем списки объединяются с помощью resNo, subRes и номера пробела.
;with first as (
select resNo, subres, startdate,
row_number() over (partition by resNo, subres order by startdate) rowNumber
from t_resourcetable
where not exists (select null
from t_resourcetable t1
where t1.resNo = t_resourcetable.resNo
and t1.subres = t_resourcetable.subres
and t1.enddate = t_resourcetable.startdate)
),
last as (
select resNo, subres, enddate,
row_number () over (partition by resNo, subres order by enddate) rowNumber
from t_resourcetable
where not exists (select null
from t_resourcetable t1
where t1.resNo = t_resourcetable.resNo
and t1.subres = t_resourcetable.subres
and t1.startdate = t_resourcetable.enddate)
)
select first.resno, first.subres, first.startdate, last.enddate
from first
inner join last
on first.resNo = last.resNo
and first.subres = last.subres
and first.rowNumber = last.rowNumber