模拟sas中的窗口功能,对行进行分组并计算最大连续成员资格

模拟sas中的窗口功能,对行进行分组并计算最大连续成员资格,sas,Sas,我有一张这样的表格,上面显示了一位会员的id、会员的开始和结束日期、会员的天数以及他们最后一次会员资格与当前会员资格之间的差距 例如,11101会员于1995年3月1日开始其会员资格,并于1997年11月1日暂停其会员资格。他们于1997年6月1日无息续会。该跨度的总天数为822+153=975天 他于1997年11月1日终止其会员资格,并于2004年11月10日重新开始。这两个成员之间的间隔为11/10/04-11/01/97=2565天 我试图找出某个成员的连续成员的最长跨度,在本例中为

我有一张这样的表格,上面显示了一位会员的id、会员的开始和结束日期、会员的天数以及他们最后一次会员资格与当前会员资格之间的差距

  • 例如,11101会员于1995年3月1日开始其会员资格,并于1997年11月1日暂停其会员资格。他们于1997年6月1日无息续会。该跨度的总天数为822+153=975天
  • 他于1997年11月1日终止其会员资格,并于2004年11月10日重新开始。这两个成员之间的间隔为11/10/04-11/01/97=2565天
我试图找出某个成员的连续成员的最长跨度,在本例中为2160。我认为在SQL中需要一个窗口函数lag/lead。但是,sql中不支持窗口函数。如何根据间隔天数对这些时段进行分组并计算最大跨度

谢谢你的帮助!

这个问题最初被标记为SQL/MySQL/Oracle。这回答了问题的原始版本

您可以为用户汇总每个成员的数据。其思想是将
间隙的非零值相加(这非常方便)。这定义了一个可用于聚合的组。在这种情况下,您可以将差距相加:

select id, sum(span), min(begin_date), max(end_date)
from (select t.*,
             sum(gap) over (partition by id order by begin_date) as grp
      from t
     ) t
group by id, grp;
对于每个id的最长值,您可以再次使用窗口函数:

select *
from (select id, sum(span), min(begin_date), max(end_date),
             row_number() over (partition by id order by sum(span) desc) as seqnum
      from (select t.*,
                   sum(gap) over (partition by id order by begin_date) as grp
            from t
           ) t
      group by id, grp
     ) ig
where seqnum = 1;

如果需要SQL答案,请使用正在使用的数据库标记问题。函数式编程是完全不同的。因此,如果您想要一个函数式编程答案,那么请删除SQL标记。你在使用MySQL还是Oracle?他们完全不同。只标记您真正使用的数据库。非常感谢!嘿,戈登,谢谢,但我刚刚发现sas和中不支持sql窗口函数。我想用sas来做这件事