Good day,
I wish to merge two dates to next closest.
Datasets are huge 500Mb to 1G so proc sql
is out of the question.
I have two data sets. First (Fleet) has observations, second has date and which generation number to use for further processing. Like this:
data Fleet
CreatedPortalDate
2013/2/19
2013/8/22
2013/8/25
2013/10/01
2013/10/07
data gennum_list
date
01/12/2014
08/12/2014
15/12/2014
22/12/2014
29/12/2014
...
What I'd like to have is a link-table like this:
data link_table
CreatedPortalDate date
14-12-03 01/12/2014
14-12-06 01/12/2014
14-12-09 08/12/2014
14-12-11 08/12/2014
14-12-14 08/12/2014
With logic that
Date < CreatedPortalDate and (CreatedPortalDate - date) = min(CreatedPortalDate - date)
What I came up with is a bit clunky and I'm looking for an efficient/better way to accomplish this.
data all_comb;
set devFleet(keep=createdportaldate);
do i=1 to n;
set gennum_list(keep=date) point=i nobs=n;
if createdportaldate > date
and createdportaldate - 15 < date then do;/*Assumption, the generations are created weekly.*/
distance= createdportaldate - date;
output;
end;
end;
run;
proc sort data=all_comb; by createdportaldate distance; run;
data link_table;
set _all_comb(drop=distance);
by createdportaldate;
if first.createdportaldate;
run;
- Any ideas how to improve or approach this issue?
- Ignorant idea: Could I create hash tables where
distance
would be stored. - Arrays maybe? somehow.
EDIT:
- common format
- Done
- Where does the billion rows come from?
- Yes, there are other data involved but the date is the only linking variable.
- Sorted?
- Yes, the data is sorted and can be sorted again.
- Are gen num dates always seven days apart ?
- No. That's the tricky part. Otherwise I could use
week
andyear
(or other binning) as unique identifier.
- No. That's the tricky part. Otherwise I could use