Удалить повторяющиеся данные в строках с датой - PullRequest
0 голосов
/ 15 марта 2012

У меня есть таблица, подобная следующей.

ID    StartDate    EndDate     AttributeA     AttributeB
--    ---------    -------     ----------     ----------
1     1/1/2009     2/1/2009    0              C
1     2/1/2009     3/1/2009    1              C
1     3/1/2009     4/1/2009    1              C
2     1/1/2010     2/1/2010    0              D
2     3/1/2010     4/1/2010    1              D

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

Из предыдущего примера мой ожидаемый конечный результат будет таким:

ID    StartDate    EndDate     AttributeA     AttributeB
--    ---------    -------     ----------     ----------
1     1/1/2009     2/1/2009    0              C
1     2/1/2009     4/1/2009    1              C
2     1/1/2010     2/1/2010    0              D
2     3/1/2010     4/1/2010    1              D

Я слил 2-ю и 3-ю строки в одну (все атрибуты, кроме даты, были одинаковыми), но я сохранил StartDate 2-й и endDate 3-й строки.

Сначала я подумал о группировке по значениям, получая MAX и MIN следующим образом

SELECT ID, MIN(StartDate), MAX(EndDate), attributeA, attributeB
FROM MyTable
Group BY ID, AttributeA, AttributeB

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

Вот пример того, что я имел в виду в своем предыдущем утверждении.

Когда исходные данные выглядят следующим образом:

ID    StartDate    EndDate     AttributeA     AttributeB
--    ---------    -------     ----------     ----------
1     1/1/2009     2/1/2009    0              C
1     2/1/2009     3/1/2009    0              D
1     3/1/2009     4/1/2009    0              D
1     4/1/2009     5/1/2009    1              D
1     6/1/2010     6/1/2009    0              D

Группировка результатов будет выглядеть следующим образом

ID    StartDate    EndDate     AttributeA     AttributeB
--    ---------    -------     ----------     ----------
1     1/1/2009     2/1/2009    0              C
1     2/1/2009     6/1/2009    0              D
1     4/1/2009     5/1/2009    1              D

И то, что я хотел бы получить, это

ID    StartDate    EndDate     AttributeA     AttributeB
--    ---------    -------     ----------     ----------
1     1/1/2009     2/1/2009    0              C
1     2/1/2009     4/1/2009    0              D
1     4/1/2009     5/1/2009    1              D
1     6/1/2010     6/1/2009    0              D

Любая помощь будет приветствоваться:)

РЕДАКТИРОВАТЬ: Я скоро буду загружать некоторые образцы данных, чтобы немного облегчить понимание моей проблемы.

EDIT2: Вот скрипт с некоторыми моими данными . Из этого примера я хотел бы получить следующие строки.

ID        StartDate     EndDate       A     B      C     D     E     F
--        ---------     -------       --    --     --    --    --    --
708513    1980-01-01    2006-07-23    15    ASDB   A     ACT   130   0
708513    2006-07-24    2009-12-08    15    ASDB   A     ACT   130   2
708513    2009-12-09    2010-01-12    0     ASDB   A     ACT   130   2
708513    2010-01-13    2079-05-30    15    ASDB   A     ACT   130   2

1 Ответ

1 голос
/ 15 марта 2012

отредактировано, следующие комментарии. Попробуйте:

;with cte as (
select m1.ID, m1.StartDate, m1.EndDate, m1.a, m1.b, m1.c, m1.d, m1.e, m1.f
from sampledata m1
where not exists
(select null from sampledata m0
 where m1.ID = m0.ID and 
       m1.a = m0.a and 
       m1.b = m0.b and 
       m1.c = m0.c and 
       m1.d = m0.d and 
       m1.e = m0.e and 
       m1.f = m0.f and 
       dateadd(day, -1, m1.StartDate) = m0.EndDate)
union all
select m1.ID, m1.StartDate, m2.EndDate, m1.a, m1.b, m1.c, m1.d, m1.e, m1.f
from cte m1
join sampledata m2 
       on m1.ID = m2.ID and 
          m1.a = m2.a and 
          m1.b = m2.b and 
          m1.c = m2.c and 
          m1.d = m2.d and 
          m1.e = m2.e and 
          m1.f = m2.f and 
          dateadd(day, 1, m1.EndDate) = m2.StartDate)
select ID, StartDate, max(EndDate) EndDate, a, b, c, d, e, f
from cte 
group by ID, StartDate, a, b, c, d, e, f
OPTION (MAXRECURSION 32767)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...