2015-10-16 3 views
0

У меня есть набор данных, в которые входит участник, зачисляется в план на некоторое время и после завершения его зачисления, если он хочет продолжить, он может записаться на следующий день, или он может принять перерыв на какое-то время и снова записаться, или он может полностью прекратить свое существование.Согласованность кандидата на соответствие Код SQL Server

Образец данных:

Member Start Date End Date Eligibility 
1  1/1/1901 12/31/2009 N 
1  1/1/2010 12/31/2010 Y 
1  1/1/2011 12/31/2011 Y 
1  1/1/2012 12/31/2012 N 
1  1/1/2013 12/31/2013 Y 
1  1/1/2014 12/31/2199 N 
2  1/1/1901 12/31/2009 N 
2  1/1/2010 12/31/2010 Y 
2  1/1/2011 12/31/2011 Y 
2  1/1/2012 12/31/2012 N 
2  1/1/2013 12/31/2013 Y 
2  1/1/2014 12/31/2199 N 

мне нужно все непрерывные отбора записей, которые будут объединены в одну единственную запись и необходимость вывода:

Member Start Date End Date Eligibility 
1  1/1/1901 12/31/2009 N 
1  1/1/2010 12/31/2011 Y 
1  1/1/2012 12/31/2012 N 
1  1/1/2013 12/31/2013 Y 
1  1/1/2014 12/31/2199 N 
2  1/1/1901 12/31/2009 N 
2  1/1/2010 12/31/2011 Y 
2  1/1/2012 12/31/2012 N 
2  1/1/2013 12/31/2013 Y 
2  1/1/2014 12/31/2199 N 

Даты могут меняться для члена к члену и eligibilities слишком ....

Пожалуйста, дайте мне знать логику для написания на SQL Server, Sybase IQ

+0

Это выглядит довольно типичные зазоры и острова типа запроса ко мне. Вот отличная статья, в которой описывается то, что вы пытаетесь сделать здесь. http://www.sqlservercentral.com/articles/T-SQL/71550/ –

ответ

0

По крайней мере, в SQL Server вы можете сделать это, используя несколько трюков с row_number(), если вы запишете строки в порядке startdate, а также упорядочите строки в порядке соответствия, startdate, тогда, если разница между двумя числа одинаковы, строки принадлежат одному диапазону и могут быть объединены. Это можно сделать следующим образом:

select Member, min(StartDate) as StartDate, max(EndDate) as EndDate, Eligibility 
from 
(
    select 
    *, row_number() over (partition by member order by Eligibility, startdate) - RN as GRP 
    from 
    (
    select 
     *, row_number() over (partition by member order by startdate) as RN 
    from 
     table1 
) X 
) Y 
group by Member, Eligibility, GRP 
order by member, startdate 

Это предполагает, что у вас нет пробелов в диапазонах дат, что, кажется, имеет место.

Пример в SQL Fiddle

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