Sql server 成员资格连续性SQL Server代码

Sql server 成员资格连续性SQL Server代码,sql-server,sap-iq,Sql Server,Sap Iq,我有一组数据,其中一名成员加入计划一段时间,注册完成后,如果他希望继续,他可以在第二天注册,或者他可以休息一段时间再次注册,或者他可以完全终止 样本数据: 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/

我有一组数据,其中一名成员加入计划一段时间,注册完成后,如果他希望继续,他可以在第二天注册,或者他可以休息一段时间再次注册,或者他可以完全终止

样本数据:

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
成员之间的日期可能不同,合格率也可能不同


请让我知道在SQL Server中编写Sybase IQ的逻辑,至少在SQL Server中,您可以通过使用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
这假设您的日期范围内没有空白,似乎就是这样


在我看来,这是一个非常典型的缺口和孤岛类型的查询。这是一篇优秀的文章,它准确地描述了您在这里要做的事情。