【问题标题】:SAS start and end date from consecutive run连续运行的 SAS 开始和结束日期
【发布时间】:2019-06-30 13:23:50
【问题描述】:

我有一个客户在一年中连续多天购买商品的数据集,例如客户 A 在 1 月 1 日、1 月 2 日和 1 月 3 日购买,然后在 2 月 1 日、2 月 2 日和 2 月 3 日再次购买。

我希望为每个客户捕获每个连续批次的第一个和最后一个日期(因此通常的 MIN / MAX 将错过日期之间的批次)。

我已经尝试了 RETAIN 和 LAG,我已经接近了,但它并不是我想要的。

如何创建为客户 A 显示两行的查询?即第 1 行显示 1 月 1 日的开始日期和 1 月 3 日的结束日期;第 2 行显示 2 月 1 日的开始日期和 2 月 3 日的结束日期。

【问题讨论】:

    标签: date sas lag retain


    【解决方案1】:

    您要求根据日期之间是否存在间隔对值进行分组。因此对此进行测试并创建一个新的组号变量。然后,您可以在分析中使用新的分组变量。

    data want ;
      set have ;
      by id date;
      dif_days = dif(sales_date);
      if first.id then group=1;
      else if dif_days > 1 then group+1;
    run;
    

    您可以调整最后一个 IF 语句中的天数,以调整您希望允许的差距有多大,并且仍然将这些事件视为同一组的一部分。

    【讨论】:

    • 汤姆-谢谢!你已经回答了我的问题。谢谢。
    • 如果我可以这么大胆并要求跟进?如果您在一行显示 1 月 1 日开始和 1 月 3 日结束的销售日期,然后另一行显示 1 月 4 日开始和 1 月 6 日结束,您会怎么做?我将如何压缩这些以显示一行,开始日期为 1 月 1 日,结束日期为 1 月 6 日?
    • 将差异检查更改为dif_days = date_range_sales_start - lag(date_range_sales_end);。没有缺失值的相同版本注意:将是dif_days = -sum (-date_range_sales_start, lag(date_range_sales_end));dif_days 可以重命名为 gap_days 更清楚。