成员资格连续性SQL Server代码

时间:2015-10-16 19:48:03

标签: sql-server sybase-iq

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

示例数据:

 .....
    socket has been created and is listening


        while(1){
            printf("$ ");
            fflush(stdout);
            read_fds = master;

            if(select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1){
                perror(" Select failed: ");
                exit(-1);
            }
            for(int i=0; i <= fdmax; i++){

                if (FD_ISSET(i, &read_fds)) {

                    if(i == STDIN){//process user input

                        char usrInputStr[256];
                        if ((rbytes = read(STDIN, usrInputStr, 256)) < 0) {
                            perror("Read error: ");
                            exit(-1);
                        }

                        fgets(usrInputStr, sizeof(usrInputStr), stdin);


                        printf("%s\n",usrInputStr);

 }else if(i == sockServer){//also need to check that this is a server
                    //handle new connection
                    addrlen = sizeof(remoteaddr);
                    sockClient = accept(sockServer, (struct sockaddr*)&remoteaddr, &addrlen);
                    if(sockClient < 0){
                        perror("Accept failed: ");
                        exit(-1);
                    }
                    FD_SET(sockClient, &master);
                    if (sockClient > sockServer)
                    {
                        fdmax = sockClient;
                    }

                }

我需要将所有连续资格记录合并为一条记录并需要输出:

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

日期可能会因会员和会员资格而异......

请让我知道在SQL Server中编写的逻辑,Sybase IQ

1 个答案:

答案 0 :(得分: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

中的示例