As featured in: Data Management Solutions Using SAS Hash Table Operations: A Business Intelligence Case Study , and built from this github repository.
Chapter 11 Pregrouped Join.sas
1 /* "Chapter 11 Pregrouped Join.sas" from the SAS Press book
2  Data Management Solutions Using SAS Hash Table Operations:
3  A Business Intelligence Case Study
4 */
5 
6 %let comp_keys = Game_SK Inning Top_Bot AB_Number ;
7 %let data_vars = Batter_ID Is_A_Hit Result ;
8 %let data_list = Batter_ID,Is_A_Hit,Result ;
9 %let sort_keys = Game_SK Inning ;
10 %let tail_keys = Top_Bot Ab_Number ;
11 %let last_key = Inning ;
12 
13 data Join_Runs_AtBats_grouped (drop = _: Runs) ;
14  if _n_ = 1 then do ;
15  dcl hash h (multidata:"Y", ordered:"A") ;
16  do _k = 1 to countw ("&tail_keys") ;
17  h.defineKey (scan ("&tail_keys", _k)) ;
18  end ;
19  do _k = 1 to countw ("&data_vars") ;
20  h.defineData (scan ("&data_vars", _k)) ;
21  end ;
22  h.defineDone() ;
23  end ;
24  do until (last.&last_key) ;
25  set dw.atbats (in=A keep=&comp_keys &data_vars
26  Runs where=(Runs))
27  dw.runs (in=R keep=&comp_keys Runner_ID)
28  ;
29  by &sort_keys ;
30  if A then h.add() ;
31  if not R then continue ;
32  call missing (&data_list, _count) ;
33  do while (h.do_over() = 0) ;
34  _count = sum (_count, 1) ;
35  output ;
36  end ;
37  if not _count then output ;
38  end ;
39  h.clear() ;
40 run ;