我有一组数据,其中一名成员进入,注册计划一段时间,并在完成注册后,如果他希望继续他可以在第二天注册,或者他可以休息一段时间再次注册,或者他可以完全终止。
示例数据:
.....
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
答案 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
这假设您的日期范围没有间隙,这似乎就是这种情况。
中的示例