45%macro mp_guesspk(baseds
53%
if &mdebug=1 %then %
do;
54 %put &sysmacroname entry vars:;
60%local var vars vcnt i j k l tmpvar tmpds rows posspks ppkcnt;
61%let vars=%upcase(%mf_getvarlist(&baseds));
62%let vars=%mf_wordsInStr1ButNotStr2(str1=&vars,str2=%upcase(&ignore_cols));
63%let vcnt=%sysfunc(countw(&vars));
66 %put &sysmacroname: &baseds has no variables! Exiting.;
71%let tmpvar=%mf_getuniquename();
73create table _data_ as select
76 %let var=%scan(&vars,&i);
77 ,sum(case when &var is missing then 1 else 0 end) as &var
84 set &syslast end=last;
87 if _name_="&tmpvar" then call symputx('rows',col1,'l');
88 else if col1=0 then vars=catx(' ',vars,_name_);
89 if last then call symputx('posspks',vars,'l');
92%let ppkcnt=%sysfunc(countw(&posspks));
93%if &ppkcnt=0 %then %do;
94 %put &sysmacroname: &baseds has no non-missing variables! Exiting.;
98proc sort data=&baseds(keep=&posspks) out=_data_ noduprec;
101%local pkds; %let pkds=&syslast;
103%if &rows > %mf_nobs(&pkds) %then %do;
104 %put &sysmacroname: &baseds has no combination of unique records! Exiting.;
110create table _data_ as select
112 %let var=%scan(&posspks,&i);
113 count(distinct &var) as &var
114 %if &i<&ppkcnt %then ,;
120proc sort; by descending col1;
124data &outds(keep=pkguesses);
125 length pkguesses $5000 vars $5000;
126 set &syslast end=last;
128 vars=catx(' ',vars,_name_);
129 if col1=&rows then do;
133 if last then call symputx('posspks',vars,'l');
136%if %mf_nobs(&outds) ge &max_guesses %then %do;
137 %put &sysmacroname: %mf_nobs(&outds) possible primary key values found;
141%if &ppkcnt=1 %then %do;
142 %put &sysmacroname: No more PK guess possible;
147%let tmpds=%mf_getuniquename();
150 %let lev1=%scan(&posspks,&i);
152 %let lev2=%scan(&posspks,&j);
153 %if &lev1 ne &lev2 %then %do;
155 proc sort data=&pkds(keep=&lev1 &lev2) out=&tmpds noduprec;
158 %if %mf_nobs(&tmpds)=&rows %then %do;
160 insert into &outds values("&lev1 &lev2");
161 %if %mf_nobs(&outds) ge &max_guesses %then %do;
162 %put &sysmacroname: Max PKs reached at Level 2 for &baseds;
170%if &ppkcnt=2 %then %do;
171 %put &sysmacroname: No more PK guess possible;
178 %let lev1=%scan(&posspks,&i);
180 %let lev2=%scan(&posspks,&j);
181 %if &lev1 ne &lev2 %then %do k=3 %to &ppkcnt;
182 %let lev3=%scan(&posspks,&k);
183 %if &lev1 ne &lev3 and &lev2 ne &lev3 %then %do;
185 proc sort data=&pkds(keep=&lev1 &lev2 &lev3) out=&tmpds noduprec;
188 %if %mf_nobs(&tmpds)=&rows %then %do;
190 insert into &outds values("&lev1 &lev2 &lev3");
191 %if %mf_nobs(&outds) ge &max_guesses %then %do;
192 %put &sysmacroname: Max PKs reached at Level 3 for &baseds;
201%if &ppkcnt=3 %then %do;
202 %put &sysmacroname: No more PK guess possible;
209 %let lev1=%scan(&posspks,&i);
211 %let lev2=%scan(&posspks,&j);
212 %if &lev1 ne &lev2 %then %do k=3 %to &ppkcnt;
213 %let lev3=%scan(&posspks,&k);
214 %if &lev1 ne &lev3 and &lev2 ne &lev3 %then %do l=4 %to &ppkcnt;
215 %let lev4=%scan(&posspks,&l);
216 %if &lev1 ne &lev4 and &lev2 ne &lev4 and &lev3 ne &lev4 %then %do;
218 proc sort data=&pkds(keep=&lev1 &lev2 &lev3 &lev4)
222 %if %mf_nobs(&tmpds)=&rows %then %do;
224 insert into &outds values("&lev1 &lev2 &lev3 &lev4");
225 %if %mf_nobs(&outds) ge &max_guesses %then %do;
226 %put &sysmacroname: Max PKs reached at Level 4 for &baseds;
236%if &ppkcnt=4 %then %do;
237 %put &sysmacroname: No more PK guess possible;
244 %let lev1=%scan(&posspks,&i);
246 %let lev2=%scan(&posspks,&j);
247 %if &lev1 ne &lev2 %then %do k=3 %to &ppkcnt;
248 %let lev3=%scan(&posspks,&k);
249 %if &lev1 ne &lev3 and &lev2 ne &lev3 %then %do l=4 %to &ppkcnt;
250 %let lev4=%scan(&posspks,&l);
251 %if &lev1 ne &lev4 and &lev2 ne &lev4 and &lev3 ne &lev4 %then
253 %let lev5=%scan(&posspks,&m);
254 %if &lev1 ne &lev5 & &lev2 ne &lev5 & &lev3 ne &lev5 & &lev4 ne &lev5 %then %do;
256 proc sort data=&pkds(keep=&lev1 &lev2 &lev3 &lev4 &lev5)
260 %if %mf_nobs(&tmpds)=&rows %then %do;
262 insert into &outds values("&lev1 &lev2 &lev3 &lev4 &lev5");
263 %if %mf_nobs(&outds) ge &max_guesses %then %do;
264 %put &sysmacroname: Max PKs reached at Level 5 for &baseds;
275%if &ppkcnt=5 %then %do;
276 %put &sysmacroname: No more PK guess possible;
283 %let lev1=%scan(&posspks,&i);
285 %let lev2=%scan(&posspks,&j);
286 %if &lev1 ne &lev2 %then %do k=3 %to &ppkcnt;
287 %let lev3=%scan(&posspks,&k);
288 %if &lev1 ne &lev3 and &lev2 ne &lev3 %then %do l=4 %to &ppkcnt;
289 %let lev4=%scan(&posspks,&l);
290 %if &lev1 ne &lev4 and &lev2 ne &lev4 and &lev3 ne &lev4 %then
292 %let lev5=%scan(&posspks,&m);
293 %if &lev1 ne &lev5 & &lev2 ne &lev5 & &lev3 ne &lev5 & &lev4 ne &lev5
294 %then %do n=6 %to &ppkcnt;
295 %let lev6=%scan(&posspks,&n);
296 %if &lev1 ne &lev6 & &lev2 ne &lev6 & &lev3 ne &lev6
297 & &lev4 ne &lev6 & &lev5 ne &lev6 %then
300 proc sort data=&pkds(keep=&lev1 &lev2 &lev3 &lev4 &lev5 &lev6)
304 %if %mf_nobs(&tmpds)=&rows %then %do;
307 values("&lev1 &lev2 &lev3 &lev4 &lev5 &lev6");
308 %if %mf_nobs(&outds) ge &max_guesses %then %do;
309 %put &sysmacroname: Max PKs reached at Level 6 for &baseds;
321%if &ppkcnt=6 %then %do;
322 %put &sysmacroname: No more PK guess possible;
327%if &mdebug=0 %then %do;