使用sas或sql根据月度日期变量向表中添加新记录

时间:2016-03-25 14:05:18

标签: sql insert sas rows

我需要根据几个字段的值将记录/行添加到现有表中。行基本上是每个不同id的月份范围 - 大多数id将有多个月但有些只有一个月。

我有一个first_date字段和一个last_date字段,需要填写行,但是两个日期之间有几个月,并为标识该月的行创建“时间ID”。

电流:

enter image description here

3 个答案:

答案 0 :(得分:0)

我认为您需要的是一个附加表,维度或映射表,它将为您提供有关这些日期/月份的信息。认为你可以加入它几次以获得完整的清单。

这就是我的所作所为:

    CREATE TABLE #tblCurrent 
  (ID INT,
  First_Date VARCHAR(9),
  Last_Date VARCHAR(9),
  TotalMonths INT,
  VAR1 INT,
  VAR2 INT)

  INSERT INTO #tblCurrent
  SELECT 123,'01jan2015','01mar2015',3,5,2
  union 
  SELECT 124,'01jul2015','01aug2015',2,5,2
  union 
  SELECT 125,'01jan2015','01jan2015',1,5,2

这只是创建一个模仿你的表......

CREATE TABLE #Month
  ([MonthName] VARCHAR(9),
  MonthRank INT)

  INSERT INTO #Month
  SELECT '01jan2015', 1
    union SELECT '01feb2015', 2
    union SELECT '01mar2015', 3
    union SELECT '01apr2015', 4
    union SELECT '01may2015', 5
    union SELECT '01jun2015', 6
    union SELECT '01jul2015', 7
    union SELECT '01aug2015', 8
    union SELECT '01sep2015', 9
    union SELECT '01oct2015', 10
    union SELECT '01nov2015', 11
    union SELECT '01dec2015', 12

这是创建一个包含月份信息的表,如订单/等级。

  SELECT c.*, m3.MonthRank Time_ID
  FROM #tblCurrent c
  JOIN #Month m ON c.First_Date = m.[MonthName]
  JOIN #Month m2 ON c.Last_Date = m2.[MonthName]
  JOIN #Month m3 ON m3.MonthRank >= m.MonthRank and m3.MonthRank <=m2.MonthRank
  ORDER BY ID, m3.MonthRank

第三步是在第一个月(加入m),最后一个月(加入m2)以及之间所有月份(m3)之间提取信息。

如果您打算继续使用&#39; 01jan2015&#39;日期的样式,建立一个日期维度表来存储一堆相关的信息可能是有用的....列,月,年等。

答案 1 :(得分:0)

如果您使用摘要,可以使用FREQ total_months;在大多数过程中或在过程频率中它都是重量。

我真的需要扩展我认为这就足够了。

data expand;
   set <data-name>;
   do time_id = 1 to total_months;
      output;
      end;
   run;

答案 2 :(得分:0)

更简洁的回复:https://stackoverflow.com/a/36222217/6111039

下面的代码应该处理困难的部分。有关如何处理time_id,请参阅http://www.ats.ucla.edu/stat/sas/faq/enumerate.htm

/*your dataset*/
data tempy;
   input id fd $ ld $ total_months time_id;
   datalines;
        123 jan mar 3 .
        124 jul aug 2 .
        125 jan jan 1 .
    ;
run;

/*make a copy of it*/
data tempy2;
    set tempy;
run;

/*select the total_months and id variables into lists*/
proc sql noprint;
    select total_months into: months_list
    separated by " "
    from tempy;
quit;

%put &months_list.;

proc sql noprint;
    select id into: ids_list
    separated by " "
    from tempy;
quit;

%put &ids_list.;


%macro inserter;

    /*for every row in the original dataset, keep track of id and how many total_months it has*/
    %do i = 1 %to %sysfunc(countw(&months_list.));
    %let this_id = %scan(&ids_list., &i.);
    %let this_many_months = %scan(&months_list., &i.);

        /*insert the same observation into the original dataset (total_months - 1) times for each row*/
        %do j = 1 %to (&this_many_months. - 1);

            proc sql;
                insert into tempy select distinct * from tempy2 (where = (id = &this_id.));
            quit;

        %end;
    %end;

    /*sort*/
    proc sort data = tempy;
        by id;
    run;

%mend inserter;

%inserter;

请注意,我只是将first_date和last_date变量作为字符串输入,以节省时间。您可以将month()函数与日期变量一起使用,以获取有助于解决time_id的信息(例如,月份(01jul2015)= 7)。