Home » Top Two Department Salaries

Top Two Department Salaries

Find out the top 2 salaries in all departments.

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 543
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Top Two Department Salaries with Power Query

Power Query solution 1 for Top Two Department Salaries, proposed by John V.:
let
 S = Excel.CurrentWorkbook(){0}[Content],
 R = Table.Group(S, "Department", {"Emp", each 
 let
 M = List.MaxN([Salary], 2),
 A = Table.SelectRows(_, each List.Contains(M , [Salary]))[Emp Name]
 in
 Text.Combine(A, ", ")
 })
in
 Table.Sort(R, "Department")

Blessings!


                    
                  
          
Power Query solution 2 for Top Two Department Salaries, proposed by Kris Jaganah:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  A = Table.Group(
    S, 
    {"Department"}, 
    {
      "Employee", 
      each [
        a = List.Min(List.MaxN([Salary], 2)), 
        b = Table.ToRows([[Emp Name], [Salary]]), 
        c = List.Select(b, (x) => x{1} >= a), 
        d = List.Zip(List.Sort(c, {{each _{1}, 1}, {each _{0}, 0}})){0}, 
        e = Text.Combine(d, ", ")
      ][e]
    }
  ), 
  B = Table.Sort(A, {"Department", 0})
in
  B
Power Query solution 3 for Top Two Department Salaries, proposed by Kris Jaganah:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  A = Table.Group(
    S, 
    {"Department"}, 
    {
      "All", 
      each [
        a = Table.AddRankColumn(_, "Rk", {"Salary", 1}, [RankKind = RankKind.Dense]), 
        b = Table.SelectRows(a, (x) => x[Rk] <= 2), 
        c = Text.Combine(Table.Sort(b, {{"Rk", 0}, {"Emp Name", 0}})[Emp Name], ", ")
      ][c]
    }
  ), 
  B = Table.Sort(A, {"Department", 0})
in
  B
Power Query solution 4 for Top Two Department Salaries, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Group = Table.Group(
    Source, 
    "Department", 
    {
      "Employee", 
      each [
        M = List.Last(List.MaxN([Salary], 2)), 
        S = Table.MaxN(_, "Salary", (f) => f[Salary] >= M)[Emp Name], 
        R = Text.Combine(S, ", ")
      ][R]
    }
  ), 
  Sort = Table.Sort(Group, "Department")
in
  Sort
Power Query solution 5 for Top Two Department Salaries, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Sol = Table.Sort(
    Table.Group(
      Source, 
      {"Department"}, 
      {
        {
          "Answer", 
          each 
            let
              a = _, 
              b = Table.Sort(a, {"Salary", 1}), 
              c = List.Combine(
                List.Transform(List.FirstN(b[Salary], 2), each List.PositionOf(b[Salary], _, 2))
              ), 
              d = List.Transform(c, each b[Emp Name]{_}), 
              e = Text.Combine(d, ", ")
            in
              e
        }
      }
    ), 
    "Department"
  )
in
  Sol
Power Query solution 6 for Top Two Department Salaries, proposed by Hussein SATOUR:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  GroupDeps = Table.Group(Source, {"Department"}, {{"All", each _}}), 
  SortDeps = Table.Sort(GroupDeps, {{"Department", 0}}), 
  Names = Table.AddColumn(
    SortDeps, 
    "Custom", 
    each Text.Combine(
      Table.SelectRows(Table.AddRankColumn([All], "Rank", {"Salary", 1}), each [Rank] < 3)[Emp Name], 
      ", "
    )
  ), 
  FinalResult = Table.RemoveColumns(Names, {"All"})
in
  FinalResult
Power Query solution 7 for Top Two Department Salaries, proposed by Abdallah Ally:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Sort = Table.Sort(Source, {{"Department", 0}, {"Salary", 1}, {"Emp Name", 0}}), 
  Transform = List.Transform(
    List.Distinct(Sort[Department]), 
    each [
      a = Table.SelectRows(Sort, (x) => x[Department] = _)[Salary], 
      b = List.FirstN(List.Distinct(a), 2), 
      c = Table.SelectRows(Sort, each List.Contains(b, [Salary]))[Emp Name], 
      d = [Department = _, Employees = Text.Combine(c, ", ")]
    ][d]
  ), 
  Result = Table.FromRecords(Transform)
in
  Result
Power Query solution 8 for Top Two Department Salaries, proposed by Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  a = Table.Group(
    S, 
    {"Department"}, 
    {
      "Names", 
      each Text.Combine(
        Table.Combine(
          List.Transform(
            Table.MaxN(
              Table.Sort(Table.Group(_, {"Salary"}, {"G", each _}), {"Salary", 1}), 
              "Salary", 
              2
            )[G], 
            each Table.Sort(_, {"Emp Name", 0})
          )
        )[Emp Name], 
        ", "
      )
    }
  ), 
  Sol = Table.Sort(a, {"Department", 0})
in
  Sol
Power Query solution 9 for Top Two Department Salaries, proposed by Antriksh Sharma:
let
  Source = Raw, 
  SortedRows = Table.Sort(Source, {{"Salary", Order.Descending}}), 
  GroupedRows = Table.Group(
    SortedRows, 
    {"Department"}, 
    {
      {
        "Names", 
        each 
          let
            TopSalaries = List.FirstN([Salary], 2), 
            Result      = Table.SelectRows(_, each List.Contains(TopSalaries, [Salary]))
          in
            Text.Combine(Result[Emp Name], ", "), 
        type text
      }
    }
  )
in
  GroupedRows
Power Query solution 10 for Top Two Department Salaries, proposed by Ahmed Ariem:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  from = Table.TransformColumnTypes(
    Source, 
    {{"Department", type text}, {"Emp Name", type text}, {"Salary", Int64.Type}}
  ), 
  Gr = Table.Group(
    from, 
    {"Department"}, 
    {
      {
        "tmp", 
        (x) =>
          [
            f = (w, z, p) => Table.Sort(w, {{"Salary", z}, {"Emp Name", p}}), 
            a = Table.LastN(f(x, 0, 0), 2)[Salary], 
            b = f(Table.SelectRows(x, (s) => List.ContainsAny({s[Salary]}, a)), 1, 0)[Emp Name], 
            c = Text.Combine(b, ", ")
          ][c]
      }
    }
  ), 
  Sort = Table.Sort(Gr, {{"Department", 0}})
in
  Sort

Solving the challenge of Top Two Department Salaries with Excel

Excel solution 1 for Top Two Department Salaries, proposed by Bo Rydobon 🇹🇭:
=GROUPBY(A2:A20,C2:C20-10^6&B2:B20,LAMBDA(x,LET(s,-LEFT(x,7),ARRAYTOTEXT(FILTER(MID(x,8,9),s<=SMALL(s,MIN(ROWS(x),2)))))),,0)
=LET(d,A2:A20,s,C2:C20,u,SORT(UNIQUE(d)),HSTACK(u,MAP(u,LAMBDA(v,LET(y,d=v,ARRAYTOTEXT(FILTER(B2:B20,y*(s>=LARGE(y*s,MIN(SUM(--y),2))))))))))
Excel solution 2 for Top Two Department Salaries, proposed by Bo Rydobon 🇹🇭:
=GROUPBY(A2:A20,C2:C20-10^6&B2:B20,LAMBDA(x,LET(s,SORT(x),ARRAYTOTEXT(MID(TAKE(s,@MATCH(INDEX(LEFT(s,7),MIN(ROWS(x),2)),LEFT(s,7))),8,9)))),,0)

=LET(z,SORT(A2:C20,2),g,GROUPBY(CHOOSECOLS(z,1,3),INDEX(z,,2),ARRAYTOTEXT,,0,-2),GROUPBY(TAKE(g,,1),DROP(g,,2),LAMBDA(x,ARRAYTOTEXT(TAKE(x,2))),,0))
Excel solution 3 for Top Two Department Salaries, proposed by John V.:
=LET(d,A2:A20,s,C2:C20,GROUPBY(d,B2:B20,ARRAYTOTEXT,,0,,s>=MAP(d,LAMBDA(x,LARGE(s*(d=x),2)))))
Excel solution 4 for Top Two Department Salaries, proposed by محمد حلمي:
=LET(d,
    A2:A20,
    u,
    SORT(
        UNIQUE(
            d
        )
    ),
    HSTACK(u,
    
MAP(u,
    LAMBDA(a,
    LET(x,
    d=a,
    i,
    x*C2:C20,
    ARRAYTOTEXT(
FILTER(B2:B20,
    x*(i>=LARGE(
        UNIQUE(
            i
        ),
        2
    )))))))))
Excel solution 5 for Top Two Department Salaries, proposed by محمد حلمي:
=LET(
    d,
    A2:A20,
    u,
    SORT(
        UNIQUE(
            d
        )
    ),
    HSTACK(
        u,
        MAP(
            u,
            LAMBDA(
                a,
                ARRAYTOTEXT(
                    TAKE(
                        SORT(
                            FILTER(
                                B2:C20,
                                d=a
                            ),
                            2,
                            -1
                        ),
                        2,
                        1
                    )
                )
            )
        )
    )
)
Excel solution 6 for Top Two Department Salaries, proposed by 🇰🇷 Taeyong Shin:
=LET(
    d,
    A2:A20,
    f,
    LAMBDA(
        x,
        LET(
            g,
            GROUPBY(
                B2:B20,
                C2:C20,
                SUM,
                ,
                0,
                -2,
                d=@x
            ),
            n,
            DROP(
                g,
                ,
                1
            ),
            TEXTJOIN(
                ", ",
                ,
                T(
                    TAKE(
                        g,
                        XMATCH(
                            2,
                            XMATCH(
                                n,
                                n
                            ),
                            -1,
                             -1
                        )
                    )
                )
            )
        )
    ),
    GROUPBY(
        d,
        d,
        f,
        ,
        0
    )
)
Excel solution 7 for Top Two Department Salaries, proposed by Kris Jaganah:
=LET(
    m,
    A2:A20,
    p,
    SORT(
        UNIQUE(
            m
        )
    ),
    HSTACK(
        p,
        MAP(
            p,
            LAMBDA(
                x,
                LET(
                    a,
                    FILTER(
                        HSTACK(
                            B2:B20,
                            C2:C20
                        ),
                        m=x
                    ),
                    b,
                    TAKE(
                        a,
                        ,
                        -1
                    ),
                    c,
                    TAKE(
                        a,
                        ,
                        1
                    ),
                    IFERROR(
                        ARRAYTOTEXT(
                            FILTER(
                                c,
                                b>=LARGE(
                                    UNIQUE(
                                        b
                                    ),
                                    2
                                )
                            )
                        ),
                        c
                    )
                )
            )
        )
    )
)
Excel solution 8 for Top Two Department Salaries, proposed by Julian Poeltl:
=LET(D,A2:A20,N,B2:B20,S,C2:C20,U,SORT(UNIQUE(D)),HSTACK(U,MAP(U,LAMBDA(A,LET(F,FILTER(HSTACK(N,S),D=A),D,DROP(F,,1),TEXTJOIN(", ",,DROP(FILTER(F,D>IFERROR(LARGE(UNIQUE(D),3),0)),,-1)))))))
Excel solution 9 for Top Two Department Salaries, proposed by Timothée BLIOT:
=LET(A,A2:A20,B,B2:B20,C,C2:C20,D,SORT(UNIQUE(A)),HSTACK(D,MAP(D,LAMBDA(x,ARRAYTOTEXT(FILTER(FILTER(B,A=x),IFERROR(FILTER(C,A=x)>=LARGE(FILTER(C,A=x),2),1)))))))
Excel solution 10 for Top Two Department Salaries, proposed by Nikola Z Grujicic - Nikola Ž Grujičić:
=LET(
    a,
     A2:C20,
     b,
     SORTBY(
         a,
          CHOOSECOLS(
              a,
              3
          ),
         -1
     ),
     d,
     CHOOSECOLS(
         b,
         1
     ),
     e,
     CHOOSECOLS(
         b,
         2
     ),
     f,
     TOCOL(
         UNIQUE(
             d
         ),
         3
     ),
     g,
     MAP(
         f,
          LAMBDA(
              ff,
               TEXTJOIN(
                   ", ",
                   ,
                   FILTER(
                       e,
                        d=ff
                   )
               )
          )
     ),
     h,
     HSTACK(
         f,
          g
     ),
     i,
     SORTBY(
         h,
          CHOOSECOLS(
              h,
              1
          )
     ),
     prvo,
     CHOOSECOLS(
         i,
         1
     ),
     drugo,
     CHOOSECOLS(
         i,
         2
     ),
     z,
     FIND(
         ", ",
          drugo
     ),
     zz,
     IFERROR(
         FIND(
             ",",
             drugo,
             z+1
         ),
          LEN(
              drugo
          )+1
     ),
     HSTACK(
         prvo,
          LEFT(
              drugo,
               zz-1
          )
     )
)
Excel solution 11 for Top Two Department Salaries, proposed by Hussein SATOUR:
=LET(d,
    A2:A20,
    s,
    C2:C20,
    u,
    UNIQUE(
        SORT(
            d
        )
    ),
    v,
    MAP(u,
    LAMBDA(x,
    ARRAYTOTEXT(FILTER(B2:B20,
    (d=x)*(IFERROR(
        s>LARGE(
            UNIQUE(
                FILTER(
                    s,
                    d=x
                )
            ),
            3
        ),
        1
    )))))),
    HSTACK(
        u,
        v
    ))
Excel solution 12 for Top Two Department Salaries, proposed by Oscar Mendez Roca Farell:
=LET(d, A2:A20, u, SORT(UNIQUE(d)), c, C2:C20, HSTACK(u, MAP(u, LAMBDA(a, LET(F, LAMBDA(i, FILTER(i, d=a)), TEXTJOIN(", ", 1, REPT(F(B2:B20), F(c)>=IFERROR(LARGE(F(c), 2), 1))))))))
Excel solution 13 for Top Two Department Salaries, proposed by Duy Tùng:
=LET(
    a,
    A2:A20,
    c,
    C2:C20,
    GROUPBY(
        a,
        B2:B20,
        ARRAYTOTEXT,
        ,
        0,
        ,
        VLOOKUP(
            a,
            IFERROR(
                GROUPBY(
                    a,
                    c,
                    LAMBDA(
                        x,
                        LARGE(
                            x,
                            2
                        )
                    )
                ),
                0
            ),
            2,
            
        )<=c
    )
)
Excel solution 14 for Top Two Department Salaries, proposed by Sunny Baggu:
=LET(
 _u, SORT(UNIQUE(A2:A20)),
 HSTACK(
 _u,
 MAP(
 _u,
 LAMBDA(x,
 LET(
 _a, SORT(FILTER(B2:C20, A2:A20 = x), 2, -1),
 _b, TOROW(TAKE(UNIQUE(TAKE(_a, , -1)), 2)),
 _c, ARRAYTOTEXT(
 FILTER(TAKE(_a, , 1), MMULT(N(TAKE(_a, , -1) = _b), {1; 1}))
 ),
 IFERROR(_c, UNIQUE(TAKE(_a, , 1)))
 )
 )
 )
 )
)
Excel solution 15 for Top Two Department Salaries, proposed by LEONARD OCHEA 🇷🇴:
=LET(a,A2:A20,b,B2:B20,c,C2:C20,GROUPBY(a,b,ARRAYTOTEXT,,0,,IFERROR(MAP(a,c,LAMBDA(x,y,OR(y=LARGE(FILTER(c,a=x),{1;2})))),1)))

With a forgotten function AGGREGATE

=LET(a,A2:A20,b,B2:B20,c,C2:C20,GROUPBY(a,b,ARRAYTOTEXT,,0,,IFERROR(MAP(a,c,LAMBDA(x,y,OR(AGGREGATE(14,6,IF(a=x,c,z),{1;2})=y))),1)))
Excel solution 16 for Top Two Department Salaries, proposed by Anshu Bantra:
=LET(
    
     depts_,
     SORT(
         UNIQUE(
             A2:A20
         )
     ),
    
     names_,
     MAP(
          depts_,
          LAMBDA(
              d,
              
               TEXTJOIN(
                    ", ",
                    ,
                   
                    CHOOSECOLS(
                        TAKE(
                            SORT(
                                FILTER(
                                    $B$2:$C$20,
                                     $A$2:$A$20 = d
                                ),
                                 2,
                                 -1
                            ),
                             2
                        ),
                         1
                    ) 
               ) 
          ) 
     ),
    
     HSTACK(
         depts_,
          names_
     )
    
)
Excel solution 17 for Top Two Department Salaries, proposed by Pieter de B.:
=LET(a,A2:A20,u,SORT(UNIQUE(a)),HSTACK(u,MAP(u,LAMBDA(x,ARRAYTOTEXT(FILTER(B2:B20,IFERROR(C2:C20>=LARGE(FILTER(C2:C20,a=x),2),1)*(a=x)))))))
Excel solution 18 for Top Two Department Salaries, proposed by Hamidi Hamid:
=LET(x,SORTBY(A2:C20,C2:C20,-1),z,DROP(x,,-1),f,DROP(GROUPBY(TAKE(z,,1),TAKE(z,,-1),ARRAYTOTEXT),-1),e,REDUCE(,TAKE(f,,-1),LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,",")))),uu,SORT(UNIQUE(TAKE(x,,1))),HSTACK(uu,BYROW(IFERROR(TAKE(e,,2),""),ARRAYTOTEXT)))
Excel solution 19 for Top Two Department Salaries, proposed by Asheesh Pahwa:
=DROP(
    REDUCE(
        "",
        SORT(
            UNIQUE(
                A2:A20
            )
        ),
        LAMBDA(
            x,
            y,
            VSTACK(
                x,
                LET(
                    f,
                    FILTER(
                        B2:C20,
                        A2:A20=y
                    ),
                    s,
                    SORT(
                        f,
                        2,
                        -1
                    ),
                    t,
                    TAKE(
                        s,
                        ,
                        -1
                    ),
                    HSTACK(
                        y,
                        TEXTJOIN(
                            ",",
                            1,
                            REDUCE(
                                "",
                                TAKE(
                                    t,
                                    2
                                ),
                                LAMBDA(
                                    a,
                                    v,
                                    VSTACK(
                                        a,
                                        FILTER(
                                            TAKE(
                                                s,
                                                ,
                                                1
                                            ),
                                            t=v
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
    ),
    1
)
Excel solution 20 for Top Two Department Salaries, proposed by ferhat CK:
=LET(d,SORT(UNIQUE(A2:A20)),dz,MAP(d,LAMBDA(x,LET(a,GROUPBY(A2:B20,C2:C20,MAX,0,0,,A2:A20=x),b,--DROP(a,,2),IFERROR(TEXTJOIN(", ",TRUE,FILTER(TAKE(DROP(a,,1),,1),(b=LARGE(b,1))+(b=LARGE(b,2)))),DROP(DROP(a,,1),,-1))))),HSTACK(d,dz))
Excel solution 21 for Top Two Department Salaries, proposed by JvdV -:
=LET(a,A2:A20,c,C2:C20,GROUPBY(a,B2:B20,ARRAYTOTEXT,,0,,COUNTIFS(a,a,c,">"&c)<2))
Excel solution 22 for Top Two Department Salaries, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=MAP(SORT(UNIQUE(A2:A20),,1),LAMBDA(z,LET(b,ISNUMBER(MAP(A2:A20,C2:C20,LAMBDA(x,y,XLOOKUP(z,x,y)))),TEXTJOIN(", ",,LET(m,FILTER(C2:C20,b),UNIQUE(MAP(TOCOL(IFERROR(LARGE(m,{1,2}),LARGE(m,{1}))),LAMBDA(p,TEXTJOIN(", ",,LET(a,MAP(m,FILTER(B2:B20,b),LAMBDA(o,i,XLOOKUP(p,o,i))),FILTER(a,NOT(ISNA(a)))))))))))))
Excel solution 23 for Top Two Department Salaries, proposed by Imam Hambali:
=LET(
a,
     SORT(
         A2:C20,
         {1,
         3},
         {1,
         -1}
     ),
    
b,
     --(TAKE(
         a,
         ,
         1
     ) = VSTACK(
         0,
          DROP(
              TAKE(
         a,
         ,
         1
     ),
              -1
          )
     )),
    
c,
     SCAN(
         0,
         b,
          LAMBDA(
              x,
              y,
               IF(
                   y=0,
                   1,
                   y+x
               )
          )
     ),
    
d,
     FILTER(
         a,
         c<3
     ),
    
GROUPBY(
    TAKE(
        d,
        ,
        1
    ),
    CHOOSECOLS(
        d,
        2
    ),
    ARRAYTOTEXT,
    0,
    0
)
)
Excel solution 24 for Top Two Department Salaries, proposed by Eddy Wijaya:
=LET(
db,A2:C20,
dept_u,UNIQUE(TAKE(db,,1)),
SORT(HSTACK(dept_u,
MAP(dept_u,LAMBDA(m,
LET(
m_db,FILTER(db,CHOOSECOLS(db,1)=m),
top,IFERROR(LARGE(TAKE(m_db,,-1),2),TAKE(m_db,,-1)),
TEXTJOIN(", ",,FILTER(CHOOSECOLS(m_db,2),TAKE(m_db,,-1)>=top))))))))
Excel solution 25 for Top Two Department Salaries, proposed by Milan Shrimali:
=MAP(SORT(UNIQUE(A2:A20),1,1),LAMBDA(X,HSTACK(X,LET(A,SORT(FILTER($B$2:$C$20,$A$2:$A$20=X),2,0),RNK,HSTACK(A,MAP(CHOOSECOLS(A,2),LAMBDA(X,RANK(X,CHOOSECOLS(A,2))))),JOIN(",",FILTER(FILTER(RNK,(CHOOSECOLS(RNK,3)=1)+(CHOOSECOLS(RNK,3)=2)),{1,0,0}))))))
Excel solution 26 for Top Two Department Salaries, proposed by Francesco Bianchi 🇮🇹:
=HSTACK(
 SORT(UNIQUE(A2:A20)),
 BYROW(
 SORT(UNIQUE(A2:A20)),
 LAMBDA(y,
 LET(
 a, $A$2:$C$20,
 b, FILTER(a, CHOOSECOLS(a, 1) = y),
 c, LARGE(CHOOSECOLS(b, 3), 2),
 d, FILTER(b, CHOOSECOLS(b, 3) >= c),
 IFERROR(
 ARRAYTOTEXT(CHOOSECOLS(SORTBY(d, CHOOSECOLS(d, 3), -1, CHOOSECOLS(d, 2), 1), 2)),
 CHOOSECOLS(b, 2)
 )
 )
 )
 )
)
Excel solution 27 for Top Two Department Salaries, proposed by RIJESH T.:
=LET(dep,
    UNIQUE(
        SORT(
            A2:A20
        )
    ),
    emp,
    MAP(dep,
    LAMBDA(d,
    TEXTJOIN(", ",
    ,
    FILTER($B$2:$B$20,
    ($A$2:$A$20=d)*($C$2:$C$20>=IFERROR(LARGE(FILTER($A$2:$C$20,
    ($A$2:$A$20=d)),
    2),
    C2:C20)))))),
    HSTACK(
        dep,
        emp
    ))
Excel solution 28 for Top Two Department Salaries, proposed by Ben Warshaw:
=LET(
 pivot,
     PIVOTBY(
         B2:B20,
          A2:A20,
          C2:C20,
          SUM,
          ,
          0,
          ,
          0
     ),
    
 labels,
     SORT(
         UNIQUE(
             A2:A20
         )
     ),
    
 ID,
     MATCH(
         labels,
          CHOOSEROWS(
              pivot,
               1
          )
     ),
    
 Output,
    
 WRAPCOLS(
 REDUCE(labels,
     ID,
     LAMBDA(st,
    curr,
    
 VSTACK(
 st,
    
 LET(
 a,
     DROP(
         INDEX(
             pivot,
              ,
              curr
         ),
          1
     ),
    
 c,
     TAKE(
         SORT(
             FILTER(
                 a,
                  a<>""
             ),
              ,
              -1
         ),
          2
     ),
    
 d,
     FILTER(DROP(
         INDEX(
             pivot,
              ,
              1
         ),
          1
     ),
     (a=INDEX(
         c,
          1
     ))),
    
 e,
     IFERROR(FILTER(DROP(
         INDEX(
             pivot,
              ,
              1
         ),
          1
     ),
     (a=INDEX(
         c,
          2
     ))),
     ""),
    
 ARRAYTOTEXT(
     VSTACK(
         d,
          e
     )
 )
 )
 )
 )),
    
 ROWS(
     labels
 )
 ),
    
 Output
)
Excel solution 29 for Top Two Department Salaries, proposed by Shaik Jafar Hussain:
=
CONCATENATEX(
 TOPN(2, 
 SUMMARIZE(Table1, Table1[Department], Table1[Emp Name],"Salary", SUM(Table1[Salary])), 
 [Salary] , DESC),
 Table1[Emp Name]&":"&FORMAT([Salary], "#,##")&" ")

Solving the challenge of Top Two Department Salaries with Python

Python solution 1 for Top Two Department Salaries, proposed by Konrad Gryczan, PhD:
import pandas as pd
path = "543 Top 2 Salaries.xlsx"
input = pd.read_excel(path, usecols="A:C")
test = pd.read_excel(path, usecols="E:F", skiprows=1, nrows=4, header=None, names=['Department', 'Emp Name'])
result = (
 input
 .groupby('Department')['Salary']
 .nlargest(2)
 .reset_index()
 .merge(input, on=['Department', 'Salary'])
 .sort_values(['Department', 'Salary', 'Emp Name'], ascending=[True, False, True])
 .groupby('Department')['Emp Name']
 .agg(', '.join)
 .reset_index()
)
print(result.equals(test)) # True
                    
                  

Solving the challenge of Top Two Department Salaries with Python in Excel

Python in Excel solution 1 for Top Two Department Salaries, proposed by Alejandro Campos:
df = xl("A1:C20", headers=True)
df_sorted = df.sort_values(by=['Department', 'Salary'], ascending=[True, False])
top_2_salaries = df_sorted.groupby('Department').head(2).reset_index(drop=True)
grouped_df = top_2_salaries.groupby('Department')['Emp Name'].apply(', '.join).reset_index()
grouped_df.columns = ['Dept', 'Emp Name']
grouped_df
                    
                  
Python in Excel solution 2 for Top Two Department Salaries, proposed by Abdallah Ally:
df = xl("A1:C20", headers=True)
# Perform data manipulation
df = df.sort_values(
 by=['Department', 'Salary', 'Emp Name'], ascending=[True, False, True]
)
values = []
for dep in df['Department'].unique():
 df_dep = df[df['Department'] == dep]
 salaries = df_dep['Salary'].unique()
 if len(salaries) > 2:
 employees = df_dep['Emp Name'][df_dep['Salary'] > salaries[2]]
 else:
 employees = df_dep['Emp Name'][df_dep['Salary'] >= salaries[-1]]
 values.append([dep, ', '.join(employees)])
 
df = pd.DataFrame(data=values, columns=df.columns[:2])
df
                    
                  
Python in Excel solution 3 for Top Two Department Salaries, proposed by Anshu Bantra:
df = xl("A1:C20", headers=True)
df.sort_values(by=['Department', 'Salary'], ascending=[True, False])
answer_expected = {}
for dept in sorted(df['Department'].unique()):
 top_emp_names = df[df['Department'] == dept].head(2)['Emp Name'].tolist()
 answer_expected[dept] = ', '.join(top_emp_names)
pd.DataFrame(
 list(answer_expected.items()),
 columns=['Department', 'Emp Names']
)
                    
                  
Python in Excel solution 4 for Top Two Department Salaries, proposed by Antriksh Sharma:
Python for excel:
df.sort_values(by=['Department', 'Salary'], ascending=[True, False], inplace=True)
top_n_salaries = df.groupby(by=['Department']).head(2)
df_join = pd.merge(top_n_salaries, df, on=['Department', 'Salary'], how='left')
df_join.drop(columns='Emp Name_x', inplace=True)
df_join.rename(columns={'Emp Name_y': 'Emp Name'}, inplace= True)
result = df_join.groupby(['Department'], as_index = False).agg({'Emp Name': ', '.join})
                    
                  

Solving the challenge of Top Two Department Salaries with R

R solution 1 for Top Two Department Salaries, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/543 Top 2 Salaries.xlsx"
input = read_excel(path, range = "A1:C20")
test = read_excel(path, range = "E2:F5", col_names = FALSE)
names(test) = c("Department", "emps")
result <- input %>%
 slice_max(Salary, n = 2, by = Department) %>%
 arrange(Department, desc(Salary), `Emp Name`) %>%
 summarise(emps = paste(`Emp Name`, collapse = ", "), .by = Department)
identical(result, test)
# [1] TRUE
                    
                  

&&

Leave a Reply