在定义新变量时,有没有办法在 SAS/SQL 中引用先前观察值?
Is there a way of referencing the prior observation's values in SAS/SQL when defining a new variable?
我有 table 个回头客,如果距离上次购买已超过 30 天,我想为每个客户 ID 添加一个标记。按ID和日期升序排列。
CustomerID Date
001 02/15/2022
001 03/01/2022
002 01/19/2022
002 02/11/2022
002 03/30/2022
...
我想以
结束
CustomerID Date Flag
001 02/15/2022 N
001 03/01/2022 N
002 01/19/2022 N
002 02/11/2022 N
002 03/30/2022 Y
...
我能想到的唯一方法是引用上一行。这是说明我的意思的伪代码。
IF (CUSTOMERID = PRIOR.CUSTOMERID) AND (DATE - PRIOR.DATE >= 30) THEN FLAG = 'Yes'
但是,在浏览了一些之后,我不确定如何在 SAS 中完成此操作,无论是在数据步骤中还是在过程中 sql。我假设有一些方法可以保存前一行的值,但我对此并不熟悉。
这就是 LAG() 函数的用途。 LAG() 函数 returns 上次调用时保存的值。因此,如果您为每次观察调用它,那么结果就是前一次观察的值。只需确保不要在某些观察中跳过 运行 LAG() 函数,否则返回的值将不是先前观察的值。
data want;
set have;
by customerid date;
if not first.customerid and (date-30 )> lag(date) then flag='YES';
else flag='NO';
run;
结果
Customer
Obs ID Date flag
1 001 2022-02-15 NO
2 001 2022-03-01 NO
3 002 2022-01-19 NO
4 002 2022-02-11 NO
5 002 2022-03-30 YES
我有 table 个回头客,如果距离上次购买已超过 30 天,我想为每个客户 ID 添加一个标记。按ID和日期升序排列。
CustomerID Date
001 02/15/2022
001 03/01/2022
002 01/19/2022
002 02/11/2022
002 03/30/2022
...
我想以
结束CustomerID Date Flag
001 02/15/2022 N
001 03/01/2022 N
002 01/19/2022 N
002 02/11/2022 N
002 03/30/2022 Y
...
我能想到的唯一方法是引用上一行。这是说明我的意思的伪代码。
IF (CUSTOMERID = PRIOR.CUSTOMERID) AND (DATE - PRIOR.DATE >= 30) THEN FLAG = 'Yes'
但是,在浏览了一些之后,我不确定如何在 SAS 中完成此操作,无论是在数据步骤中还是在过程中 sql。我假设有一些方法可以保存前一行的值,但我对此并不熟悉。
这就是 LAG() 函数的用途。 LAG() 函数 returns 上次调用时保存的值。因此,如果您为每次观察调用它,那么结果就是前一次观察的值。只需确保不要在某些观察中跳过 运行 LAG() 函数,否则返回的值将不是先前观察的值。
data want;
set have;
by customerid date;
if not first.customerid and (date-30 )> lag(date) then flag='YES';
else flag='NO';
run;
结果
Customer
Obs ID Date flag
1 001 2022-02-15 NO
2 001 2022-03-01 NO
3 002 2022-01-19 NO
4 002 2022-02-11 NO
5 002 2022-03-30 YES