As featured in: Data Management Solutions Using SAS Hash Table Operations: A Business Intelligence Case Study , and built from this github repository.
Chapter 9 HoH Multiple Medians.sas
1 /* "Chapter 9 HoH Multiple Medians.sas" from the SAS Press book
2  Data Management Solutions Using SAS Hash Table Operations:
3  A Business Intelligence Case Study
4 */
5 
6 proc sql;
7  create table HoH_List as
8  select distinct "Distance " as Field
9  ,Result
10  from dw.Atbats
11  where Distance is not null
12  outer union corr
13  select distinct "Direction" as Field
14  ,Result
15  from dw.Atbats
16  where Distance is not null
17  ;
18 quit;
19 
20 data Medians;
21  if 0 then set dw.AtBats(keep=Result);
22  length Median 8;
23  keep Result Field Median;
24  dcl hash HoH(ordered:"A");
25  HoH.defineKey ("Result","Field");
26  HoH.defineData ("Result","Field","h","iter");
27  HoH.defineDone();
28  dcl hash h();
29  dcl hiter iter;
30 
31  do until(lr);
32  set HoH_List end = lr;
33  h = _new_ hash(dataset:cats("dw.AtBats"
34  || "(where=(Result='"
35  ,Result
36  ,"')"
37  ,"rename=("
38  ,field
39  ,"=Median))")
40  ,multidata:"Y",ordered:"A");
41  h.defineKey("Median");
42  h.defineDone();
43  iter = _new_ hiter("h");
44  HoH.add();
45  end;
46 
47  dcl hiter HoH_Iter("HoH");
48  do while (HoH_Iter.next() = 0);
49  Count = h.num_items;
50  iter.first();
51  do i = 1 to .5*Count - 1;
52  iter.next();
53  end;
54  /* could add logic here to interpolate if needed */
55  output;
56  end;
57  stop;
58 run;