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 Percentiles.sas
1 /* "Chapter 9 HoH Percentiles.sas" from the SAS Press book
2  Data Management Solutions Using SAS Hash Table Operations:
3  A Business Intelligence Case Study
4 */
5 
6 data Percentiles;
7  keep Variable Percentile Value;
8  length Variable $32;
9  format Percentile percent5. Value Best.;
10  dcl hash HoH(ordered:"A");
11  HoH.defineKey ("Variable");
12  HoH.defineData ("H","ITER","Variable");
13  HoH.defineDone();
14  dcl hash h();
15  dcl hiter iter;
16 
17  h = _new_ hash(dataset:"dw.AtBats(where=(Value) rename=(Distance=Value))"
18  ,multidata:"Y",ordered:"A");
19  h.defineKey("Value");
20  h.defineDone();
21  iter = _new_ hiter("H");
22  Variable = "Distance";
23  HoH.add();
24 
25  h = _new_ hash(dataset:"dw.AtBats(where=(Value) rename=(Direction=Value))"
26  ,multidata:"Y",ordered:"A");
27  h.defineKey("Value");
28  h.defineDone();
29  iter = _new_ hiter("H");
30  Variable = "Direction";
31  HoH.add();
32 
33  array _ptiles(6) _temporary_ (.05 .1 .25 .5 .75 .95);
34  call sortn(of _ptiles(*));
35 
36  dcl hiter HoH_Iter("HoH");
37  do while (HoH_Iter.next() = 0);
38  Counter = 0;
39  num_items = h.num_items;
40  do i = 1 to dim(_ptiles);
41  Percentile = _ptiles(i);
42  do while (Counter lt Percentile*num_items);
43  Counter + 1;
44  iter.next();
45  end;
46  /* could add logic here to read next value to interpolate */
47  output;
48  end;
49  end;
50  stop;
51  Value = 0;
52 run;