我需要根据几个字段的值将记录/行添加到现有表中。行基本上是每个不同id的月份范围 - 大多数id将有多个月但有些只有一个月。
我有一个first_date字段和一个last_date字段,需要填写行,但是两个日期之间有几个月,并为标识该月的行创建“时间ID”。
电流:
答案 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)。