Task

Find the top   N   salaries in each department,   where   N   is provided as a parameter.

Use this data as a formatted internal data structure (adapt it to your language-native idioms, rather than parse at runtime), or identify your external data source:

Employee Name,Employee ID,Salary,Department
Tyler Bennett,E10297,32000,D101
John Rappl,E21437,47000,D050
George Woltman,E00127,53500,D101
Adam Smith,E63535,18000,D202
Claire Buckman,E39876,27800,D202
David McClellan,E04242,41500,D101
Rich Holcomb,E01234,49500,D202
Nathan Adams,E41298,21900,D050
Richard Potter,E43128,15900,D101
David Motsinger,E27002,19250,D202
Tim Sampair,E03033,27000,D101
Kim Arlich,E10001,57000,D190
Timothy Grove,E16398,29900,D190



go =>
  Emp = [
          % Employee Name,Employee ID,Salary,Department
          ["Tyler Bennett","E10297","32000","D101"],
          ["John Rappl","E21437","47000","D050"],
          ["George Woltman","E00127","53500","D101"],
          ["Adam Smith","E63535","18000","D202"],
          ["Claire Buckman","E39876","27800","D202"],
          ["David McClellan","E04242","41500","D101"],
          ["Rich Holcomb","E01234","49500","D202"],
          ["Nathan Adams","E41298","21900","D050"],
          ["Richard Potter","E43128","15900","D101"],
          ["David Motsinger","E27002","19250","D202"],
          ["Tim Sampair","E03033","27000","D101"],
          ["Kim Arlich","E10001","57000","D190"],
          ["Timothy Grove","E16398","29900","D190"]
        ],
  print_top_ranks(Emp,3),
  nl.
 
print_top_ranks(Emp,N) =>
  printf("Top %d ranks per department:\n", N),
  foreach(Dept in [Dept : [_,_,_,Dept] in Emp].sort_remove_dups())
     printf("Department %s\n", Dept),
     Emp2 = sort_down([[Salary,Name] : [Name,_,Salary,D] in Emp, D = Dept]),
     foreach({[Salary,Name],E} in zip(Emp2,1..Emp2.length), E <= N)
       printf("%-20s %-10s\n", Name, Salary)
     end,
     nl
  end.