SAS根据起始价格创建滞后

SAS根据起始价格创建滞后,sas,Sas,我的数据集在n个多星期内,在x多个地点有多个项目的价格。我希望创建一个变量,对于任何给定的地点/周,显示第一个列出的原始价格。我的数据集如下所示: data have; input item $ location $ week price; cards; X NC 1 10 X NC 2 10 X NC 3 9.75 X SC 2 8 X SC 3 5 Y NC 1 100 Y NC 2 75 Y NC 3 50 Y NC 4 50 ; run; data want; inpu

我的数据集在n个多星期内,在x多个地点有多个项目的价格。我希望创建一个变量,对于任何给定的地点/周,显示第一个列出的原始价格。我的数据集如下所示:

data have;
    input item $ location $ week price;
cards;
X NC 1 10
X NC 2 10
X NC 3 9.75
X SC 2 8
X SC 3 5
Y NC 1 100
Y NC 2 75
Y NC 3 50
Y NC 4 50
;
run;
data want;
    input item $ location $ week price start_price;
cards;
X NC 1 10 10
X NC 2 10 10
X NC 3 9.75 10 
X SC 2 8 8
X SC 3 5 8
Y NC 1 100 100
Y NC 2 75 100
Y NC 3 50 100
Y NC 4 50 100
;
run;
我想要一个如下所示的数据集:

data have;
    input item $ location $ week price;
cards;
X NC 1 10
X NC 2 10
X NC 3 9.75
X SC 2 8
X SC 3 5
Y NC 1 100
Y NC 2 75
Y NC 3 50
Y NC 4 50
;
run;
data want;
    input item $ location $ week price start_price;
cards;
X NC 1 10 10
X NC 2 10 10
X NC 3 9.75 10 
X SC 2 8 8
X SC 3 5 8
Y NC 1 100 100
Y NC 2 75 100
Y NC 3 50 100
Y NC 4 50 100
;
run;
我知道我可以用第一个。变量以某种方式执行此操作,但无法对其进行排序。帮忙

我试过这个,但看起来我需要多个分组来获得正确的位置…我需要连接项目/位置还是有更优雅的方法来做到这一点

data want;
    set have;
    by item;
    if first.item then start_price=price;
    start_price+0;
run;
我将使用retain保留最后一行的值。结果将与带+0的sum语句相同,但我认为更有意义

如果我对问题的理解正确,您希望first.location设置起始价格。仅按项目位置使用;这样做

data want;
    set have;
    by item location;
    retain start_price;
    if first.location then start_price=price;
run;

为了演示如何在小组中获得第一条记录,这里还有一个解决方案

data have;
    input item $ location $ week  price;
cards;
X NC 1 10
X NC 2 10
X NC 3 9.75
X SC 2 8
X SC 3 5
Y NC 1 100
Y NC 2 75
Y NC 3 50
Y NC 4 50
;
run;
首先使用单独的查询语句

proc sql;
 create table START_PRICE as
 select Item, Location, Price as Start_Price
 from HAVE a
 where Week =
 (select min(week)
 from have b
 where a.item=b.item and a.location=b.location)
 order by a.item, a.location;

 Create table WANT as 
 Select a.item, a.location, a.week, a.price, b.start_price
 From HAVE a left join START_PRICE b
  on a.item=b.item and a.location=b.location
 order by a.item, a.location, a.week;
Quit;
然后作为一个查询

Proc Sql ;
  Create table WANT2 as
    Select a.Item, a.Location, a.Week, a.Price, b.Start_Price
    from HAVE a
        Left Join
        (select Item, Location, Price as Start_Price
         from HAVE a1
         where Week =
          (select min(week) from have b1
           where a1.item=b1.item and a1.location=b1.location)
          ) b
        on a.item=b.item and a.location=b.location
    order by a.item, a.location, a.week;
Quit;