2015-10-16 31 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中,如果按照startdate的順序對行進行編號,並且按照資格順序排序行,則可以使用row_number()中的一些技巧來做到這一點,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