Sql SAS-将连续日期分组并查找每个组的计数

Sql SAS-将连续日期分组并查找每个组的计数,sql,sas,proc-sql,Sql,Sas,Proc Sql,只是想找到最有效的方法。如果您查看下面的日期列,您将发现两个连续的组,其中第一组的最后日期为2018-01-04,总数为4,第二组的最后日期为2018-01-13,总数为4 我的最终目标是获得最新的组或最新的连续天数 已编辑:我希望表格显示每个不同的帐户id,以显示最近看到的连续天数的总数。 例如。账户id:100012345累计连续天数:400 帐户id:唯一 累计连续天数:该帐户ID的最近一组连续天数。 ---日期-- 2018-01-01 2018-01-02 2018-01-03 201

只是想找到最有效的方法。如果您查看下面的日期列,您将发现两个连续的组,其中第一组的最后日期为2018-01-04,总数为4,第二组的最后日期为2018-01-13,总数为4

我的最终目标是获得最新的组或最新的连续天数

已编辑:我希望表格显示每个不同的帐户id,以显示最近看到的连续天数的总数。

例如。账户id:100012345累计连续天数:400

帐户id:唯一

累计连续天数:该帐户ID的最近一组连续天数。

---日期--

2018-01-01

2018-01-02

2018-01-03

2018-01-04

2018-01-10

2018-01-11

2018-01-12

2018-01-13

我正在处理4000个独特的帐户,每个帐户平均总共有500个日期。如果没有有效的方法,那么我很乐意接受任何能让我得到最终结果的帮助。请帮忙


谢谢

假设数据是按
accountid
date
排序的,则在组上进行简单的DOW循环可以发现并输出最近连续日期“运行”的特征

样本数据

大约3年前开始的500个有几百个日期的账户,随机输出。每42个帐户的情况下,长期结束良好的过去是被迫的

data have(keep=accountid date);
  do accountid = 1 to 500;
    stopdate = .;
    do date = today()-1000 to today();
      if mod(accountid,42) = 0 then do;
        if missing(stopdate) then stopdate = today()-100 * ranuni(123);
        if today()-500 < date < stopdate then output;
      end;
      else
      if ranuni(123) > 0.15 and date < today() - accountid/10 then
        output;
    end;
  end;
  format date stopdate yymmdd10.;
run;

您提到了帐户,但没有帐户变量。这是你的逻辑吗?请展示您尝试过的代码,并描述您的效率问题。数据分类了吗?数据步解决方案可能比SQL更直接。可以使用LAG()或DIF()查找间隙。即使你必须对它进行排序,2M记录的排序也不会那么糟糕,除非你有很多变量。帐户只是逻辑的一部分。我的问题只是想寻找一种方法来确定这些日期差距。那么lag()和DIF()可以做到这一点吗?是的,如果数据按日期排序。是的,所以我将我的表按帐户级别排序,然后按日期排序。很抱歉,我可能需要你让你在如何使用diff()和lag()函数方面简化一下。请编辑你的问题,以显示包括帐号在内的示例数据。听起来你想在一个账户中计算连续的日期?所以帐号是逻辑的一部分。还显示要创建的所需数据集。同时显示您正在尝试的代码。这将有助于人们帮助你。嗨,richard,我想它奏效了。非常感谢!我只是想更清楚的了解。。。如果我错了,请纠正我“Don=1乘1直到(last.accountid)循环”是否正确?n是计数器吗?是的,我已经重新调整了自动
\u n
变量的用途,使其成为组内行序列(从1开始)的计数器。自动变量被隐式删除。当检测到间隙时,新的连续“运行”已开始,因此保存当时的序列号以计算组末尾的运行长度(last.accountid)。
data want (keep=accountid last_:);
  do _n_ = 1 by 1 until (last.accountid);
    set have;
    by accountid date;

    if dif(date) > 1 or _n_ = 1 then do; start_n = _n_; start_date = date; end;
  end;

  last_run_length = _n_ - start_n + 1;
  last_run_start_date = start_date;
  last_run_end_date = date;

  format last_run_start_date last_run_end_date yymmdd10.;
run;