基于另一个表的索引值的SAS数据处理

基于另一个表的索引值的SAS数据处理,sas,Sas,我需要以下建议(在SAS企业指南6.1中工作) 我有两张桌子: 表1:状态、日期、十进制值、描述(字符长度4);表1对每个州都有多个描述、日期和值 表2:州、年、季、描述(字符长度4)、值; 表2有多条相同状态和描述的记录,但值随日期而变化 示例表: Table 1 state date description value 1 IA 11/1/2013 A -0.5 IA 11/1/2013 B

我需要以下建议(在SAS企业指南6.1中工作)

我有两张桌子: 表1:状态、日期、十进制值、描述(字符长度4);表1对每个州都有多个描述、日期和值

表2:州、年、季、描述(字符长度4)、值; 表2有多条相同状态和描述的记录,但值随日期而变化

示例表:

Table 1
state      date    description    value 1
IA        11/1/2013     A          -0.5
IA        11/1/2013     B           4.5
IA        9/1/2012      A           1.2
IA        9/1/2012      B            5
OH        6/1/2013      A           1.2
OH        6/1/2013      B           -2
对于表1中的每个观察,我希望能够识别与观察相关的日期,然后将表2中从该日期起1年内的特定状态和描述值相加,保存总和,然后对表1中的每个记录重复该值

我正在寻找的结果
表3

state    date    Descr    Value 1    Sum of Value 2 (over a year)
IA    11/1/2013    A    -0.5    =sum (Value 2 from (2013 quarter 4, 2013 quarter 3, 2013 quarter 2, 2013 quarter 1) for IA with desc = A)
IA    09/1/2012    B     5.0    =sum(Value 2 from (2012 quarter 2, 2012 quarter 1, 2011 quarter 4, 2011 quarter 3) for IA with Desc = B)                            
我正在努力从表1中找出正确的观察结果,以便在表2中找出日期、状态和描述


谢谢。

最简单的答案很可能是最好的:SQL连接。将季度转换为日期——我认为这比将东西转换为季度容易,因为
intck
非常友好。我在这里展示了如何在dataset或sql中执行此操作

data Table1;
input state $ date :mmddyy10. description $ value1;
format date DATE9.;
datalines;
IA        11/1/2013     A          -0.5
IA        11/1/2013     B           4.5
IA        9/1/2012      A           1.2
IA        9/1/2012      B            5
OH        6/1/2013      A           1.2
OH        6/1/2013      B           -2
;;;;
data table2;
input State $ Year Quarter Description $ Value2 :comma10.;
datevar = mdy(quarter*3,1,year);
format datevar DATE9.;
datalines;
IA      2013    4        A          40,350 
IA      2013    3        A          1 
IA      2013    2        A          150,000 
IA      2013    1        A          100,000 
IA      2012    4        A          5,000 
IA      2012    3        A          25,000 
IA      2012    2        B          50,000 
;;;;
run;

proc sql;
create table table3 as 
  select t1.state, t1.date,t1.description, t1.value1, sum(t2.value2) as value2sum
   from table1 t1 left join table2 t2
    on (t1.state=t2.state and t1.description=t2.description
        and 0 le intck('Quarter',mdy(t2.quarter*3,1,t2.year),t1.date) lt 4)
        group by t1.state, t1.date,t1.description,t1.value1;
quit;

您可能需要根据您希望基于什么值包含哪些记录来调整等式,并且您可能需要调整
intck
来定义所需的方式(您要求2012年第二季度为2012年9月1日,这会很奇怪,因为9月1日通常肯定是第三季度的一部分;如果您的公司不是这样,请使用
intck
中的移位指数来调整公司的季度).

我不明白您是如何从表3提供的数据和解释中得到的。为什么只有两行?表3只是一个示例。最终结果是表1中的每个唯一状态、日期、描述记录都有一行。我可以使用表1中的日期将其更改为年和季度,以便于查找值在表3中,我还认为我可以使用宏来循环表1中的观察结果,但我不确定如何识别这些观察结果。不,宏不是解决问题的方法。我对你在这里使用的语言感到困惑。你在表1中识别观察结果有什么困难?或者,你的意思是,识别什么ich表2观察值与表1观察值匹配?我肯定是想得太多了(我要为表1中的每个观察值创建临时子表,从表2中获取日期范围内的匹配记录,使用proc方法将值相加,然后再返回)。这是一个更优雅的方法。谢谢。
data Table1;
input state $ date :mmddyy10. description $ value1;
format date DATE9.;
datalines;
IA        11/1/2013     A          -0.5
IA        11/1/2013     B           4.5
IA        9/1/2012      A           1.2
IA        9/1/2012      B            5
OH        6/1/2013      A           1.2
OH        6/1/2013      B           -2
;;;;
data table2;
input State $ Year Quarter Description $ Value2 :comma10.;
datevar = mdy(quarter*3,1,year);
format datevar DATE9.;
datalines;
IA      2013    4        A          40,350 
IA      2013    3        A          1 
IA      2013    2        A          150,000 
IA      2013    1        A          100,000 
IA      2012    4        A          5,000 
IA      2012    3        A          25,000 
IA      2012    2        B          50,000 
;;;;
run;

proc sql;
create table table3 as 
  select t1.state, t1.date,t1.description, t1.value1, sum(t2.value2) as value2sum
   from table1 t1 left join table2 t2
    on (t1.state=t2.state and t1.description=t2.description
        and 0 le intck('Quarter',mdy(t2.quarter*3,1,t2.year),t1.date) lt 4)
        group by t1.state, t1.date,t1.description,t1.value1;
quit;