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

时间:2013-10-22 16:28:54

标签: sas

我需要关于以下内容的建议(在SAS企业指南6.1中工作)

我有2张桌子: 表1:状态,日期,Decimal_Value,描述(字符长度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
Table 2
State   Year    Quarter Description Value 2
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 

对于表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中选出日期,状态和描述。

谢谢。

1 个答案:

答案 0 :(得分:0)

最有可能的是,最简单的答案是最好的:SQL连接。将季度转换为日期而不是相反 - 我认为,将事物转换为季度更容易,因为intck非常友好。我将在数据集或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以定义季度您想要的(您要求2012Q2)在9/1/2012,这将是奇怪的,因为9/1通常是q3的一部分;如果在您的公司中不是这样,请使用intck中的shift index来调整到您公司的季度。