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



#lang transd
 
 
MainModule: {
tbl : String( 
`EmployeeName,EmployeeID,Salary:Int,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`),
 
    N: 2,
    _start: (λ 
    (with tabl Table()
        (load-table tabl tbl)
        (build-index tabl "Department")
        (with rows (tsd-query tabl 
            select: ["Department"] 
            as: [[String()]] :distinct sortby: "Department" )
        (for row in rows do
            (with recs (tsd-query tabl 
                select: all 
                    as: [[String(), String(), Int(), String()]]
            satisfying: (lambda Department String() 
                            (eq Department (get row 0))) 
                sortby: "Salary" :desc 
                 limit: N)
           (for rec in recs do (textout rec "\n")))))))
}