【问题标题】:Alternative to LAG functionLAG 功能的替代方案
【发布时间】:2026-02-04 14:00:01
【问题描述】:

我的数据集结构如下:

ID, Order Date, Delivery Date, Flag
1, 10/03/12, 15/03/12, 
1, 17/03/12, 20/03/12, 1

我希望能够计算第一个交货日期和后续订单日期之间的日期差。最终目标是使用标识符对这些记录进行分组。

已经尝试使用 monotonic() 和 monotonic()+1 进行自连接 - 但这样做的问题是每个 ID 可以有多个不同数量的行需要组合在一起。我正在使用 SAS Enterprise Guide 7 - 遗憾的是 LAG 不可用。

我希望实现的一个例子是:

ID, Order Date, Deliv Date, Order Date_1, Deliv Date_1, DateDIFF(Deliv Date - Order Date_1)
1, 10/03/12, 15/03/12, 17/03/12, 20/03/12, 2

有什么想法吗?

【问题讨论】:

  • 这可以在按ID 分组时使用 SAS Retain 功能完成。请提供所需数据的示例,我会给你代码。
  • 所需的数据集将保留每个 ID 1 行,并根据日期差异为每个订单和交货日期保留多列。
  • 好的,请添加包含示例数据的示例。我将发布一个初步答案。听起来您也想转置数据。
  • 如果 ID 1 有 3 个订单,您想要 DateDiff 的 3 列吗?考虑我回答中的数据示例。
  • LAG 不可用是什么意思? LAG 仅在 PROC SQL 中“不可用”,数据步骤将按预期正常工作。

标签: sas


【解决方案1】:

您需要将proc sort数据按降序排列Delivery_Date然后retain上一条记录的值,同时按ID分组以计算差异。

代码:

 data have;
   infile datalines dlm=',' dsd;
   informat id 11. Order_Date ddmmyy8. Delivery_Date ddmmyy8. flag 11.;
   format Order_Date ddmmyy8. Delivery_Date ddmmyy8.;
   input ID Order_Date Delivery_Date Flag;
   datalines;
1, 10/03/12, 15/03/12,.
1, 17/03/12, 20/03/12, 1
2, 10/03/12, 10/03/12,.
2, 17/03/12, 20/03/12, 1
2, 10/03/12, 27/03/12,1
2, 17/03/12, 23/03/12, 1
run;

proc sort data=have; 
  by id descending Delivery_Date ; 
run;

data want;
  set have;
  by id;
  retain nxt_date;
  if first.id=1 then do; 
    nxt_date = Delivery_Date; 
    diff=0; 
  end;
  else do; 
    prv_date=nxt_date;
    diff=nxt_date-Delivery_Date;
    nxt_date = Delivery_Date;
  end;
  format prv_date ddmmyy8.
  drop nxt_date;
run;

输出:

id=1 Order_Date=17/03/12 Delivery_Date=20/03/12 flag=1 diff=0 prv_date=.
id=1 Order_Date=10/03/12 Delivery_Date=15/03/12 flag=. diff=5 prv_date=20/03/12
id=2 Order_Date=10/03/12 Delivery_Date=27/03/12 flag=1 diff=0 prv_date=.
id=2 Order_Date=17/03/12 Delivery_Date=23/03/12 flag=1 diff=4 prv_date=27/03/12
id=2 Order_Date=17/03/12 Delivery_Date=20/03/12 flag=1 diff=3  prv_date=23/03/12
id=2 Order_Date=10/03/12 Delivery_Date=10/03/12 flag=. diff=10 prv_date=20/03/12

【讨论】:

    最近更新 更多