2014-10-09 2 views
0

У меня есть временная таблица базы данных, где некоторые данные дублируются.Объединить повторяющиеся временные записи в базе данных

EmployeeId StartDate EndDate  Column1 Column2 
1000   2009/05/01 2010/04/30 X   Y 
1000   2010/05/01 2011/04/30 X   Y 
1000   2011/05/01 2012/04/30 X   X 
1000   2012/05/01 2013/04/30 X   Y 
1000   2013/05/01 NULL   X   X 

Как видно выше, есть некоторые строки, которые являются избыточными и могут быть объединены, чтобы сформировать одну строку, не нарушая достоверности данных. Я хочу объединить такие строки, где это возможно, и результат должен выглядеть так:

EmployeeId StartDate EndDate  Column1 Column2 
1000   2009/05/01 2011/04/30 X   Y 
1000   2011/05/01 2012/04/30 X   X 
1000   2012/05/01 2013/04/30 X   Y 
1000   2013/05/01 NULL   X   X 

Как это можно достичь?

+0

Они не дубликаты, но перекрывающиеся, не так ли? Что такое ключевой столбец, только EmployeeId или комбинация EmployeeId и Column1 + Column2? –

+0

В качестве первичного ключа для таблицы есть отдельный столбец. Но я не вижу здесь этого. Для данного EmployeeId мне нужно сортировать информацию в столбце 1 и столбце2 временно, не имея лишних строк, если нет изменений в информации. –

+0

На какой основе вы удалили 2-ю строку на выходе –

ответ

1

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

with t1 as --tag first row with 1 in a continuous time series 
(
select t1.*, case when t1.column1=t2.column1 and t1.column2=t2.column2 
        then 0 else 1 end as tag 
    from your_table t1 
    left join your_table t2 
    on t1.EmployeeId= t2.EmployeeId and dateadd(day,-1,t1.StartDate)= t2.EndDate 
) 
select t1.EmployeeId, t1.StartDate, 
     case when min(T2.StartDate) is null then null 
      else dateadd(day,-1,min(T2.StartDate)) end as EndDate, 
     t1.Column1, t1.Column2 
    from (select t1.* from t1 where tag=1) as t1 -- to get StartDate 
    left join (select t1.* from t1 where tag=1) as t2 -- to get a new EndDate 
    on t1.EmployeeId= t2.EmployeeId and t1.StartDate < t2.StartDate 
group by t1.EmployeeId, t1.StartDate, t1.Column1, t1.Column2 
+0

Да, все записи будут непрерывными в этом случае. Очень приятное решение! –

+0

Всего один комментарий. Утверждение case внутри CTE должно иметь «и» вместо «или». –

+0

@KlaasJan да. Я обновил ответ. Я тестировал DB2, это ошибка, когда я редактировал здесь. –

0

Попробуйте

SELECT A.EmployeeId,A.StartDate,A.EndDate,A.Column1,A.Column2 FROM (SELECT EmployeeId,StartDate,EndDate,Column1,Column2 FROM TEMP GROUP BY EmployeeId,StartDate,EndDate,Column1,Column2)A 
JOIN 
(SELECT Y.EmployeeId,Y.StartDate,Y.EndDate,Y.Column1,Y.Column2 FROM TEMP X JOIN TEMP Y ON X.EmployeeId=Y.EmployeeId AND DATEADD(day,1,X.EndDate)=Y.StartDate)B 
ON A.EndDate=DATEADD(day,-1,B.StartDate) 

Примечание: TEMP таблица с указанными столбцами

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