Home » Top Rank Improvements

Top Rank Improvements

List the Top 3 players whose rank improved the most from 2021 to 2022. Rafael Nadal’s 2021 rank was 5 and 2022 rank was 1. Hence, he improved by 4. Taylor Fritz’s 2021 rank was 8 and 2022 rank was 16. Hence, he didn’t improve as his rank fell down. In other words, he improved by -8. If either column B or C is empty, then that row has to be discarded.

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

Solving the challenge of Top Rank Improvements with Power Query

Power Query solution 1 for Top Rank Improvements, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  AJumb = Table.Sort(
    Table.AddColumn(Source, "Jumbed Ranking", each [2021] - [2022]), 
    {"Jumbed Ranking", 1}
  ), 
  Remove = Table.SelectColumns(AJumb, {"Player", "Jumbed Ranking"}), 
  Filter = Table.SelectRows(
    Remove, 
    each [Jumbed Ranking] >= List.Distinct(Remove[Jumbed Ranking]){2}
  )
in
  Filter
Power Query solution 2 for Top Rank Improvements, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "TennisPlayers"]}[Content], 
  FilteredEmptyRows = Table.SelectRows(Source, each ([2021] <> null) and ([2022] <> null)), 
  AddedJumpedRanking = Table.AddColumn(
    FilteredEmptyRows, 
    "Jumped Ranking", 
    each ([2022] - [2021]) * - 1
  ), 
  GroupedByJumpedRanking = Table.Group(
    AddedJumpedRanking, 
    {"Jumped Ranking"}, 
    {{"Player", each _[Player]}}
  ), 
  SortedJumpedRanking = Table.Sort(GroupedByJumpedRanking, {{"Jumped Ranking", Order.Descending}}), 
  AddedTopN = Table.AddIndexColumn(SortedJumpedRanking, "TopN", 1, 1, Int64.Type), 
  FilteredTop3 = Table.SelectRows(AddedTopN, each ([TopN] = 1 or [TopN] = 2 or [TopN] = 3)), 
  ExpandedPlayer = Table.ExpandListColumn(FilteredTop3, "Player")[[Player], [Jumped Ranking]]
in
  ExpandedPlayer
Power Query solution 3 for Top Rank Improvements, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source   = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Criteria = 3, 
  Diff     = Table.AddColumn(Source, "Difference", each [2021] - [2022]), 
  Grouped  = Table.Group(Diff, "Difference", {"Group", each _}), 
  TopN     = Table.MaxN(Grouped, "Difference", 3), 
  Return   = Table.Combine(TopN[Group])[[Player], [Difference]]
in
  Return
Power Query solution 4 for Top Rank Improvements, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Added = Table.AddColumn(Source, "Jumped", each [2021] - [2022]), 
  Min = List.Min(
    List.FirstN(List.Distinct(List.Sort(List.RemoveNulls(Added[Jumped]), Order.Descending)), 3)
  ), 
  Filtered = Table.SelectRows(Added, each [Jumped] >= Min)[[Player], [Jumped]], 
  Sol = Table.Sort(Filtered, {{"Jumped", Order.Descending}, {"Player", Order.Descending}})
in
  Sol
Power Query solution 5 for Top Rank Improvements, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  tab = Table.AddColumn(
    Fonte, 
    "Jumper Ranking", 
    each List.Min(List.Select({[2021] - [2022]}, each _ > 0))
  ), 
  fil = Table.SelectRows(tab, each ([Jumper Ranking] <> null)), 
  result = Table.Sort(fil, {{"Jumper Ranking", Order.Descending}, {"Player", Order.Descending}})[
    [Player], 
    [Jumper Ranking]
  ]
in
  result
Power Query solution 6 for Top Rank Improvements, proposed by Brian Julius:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  RemoveNulls = Table.SelectRows(Source, each List.AllTrue({[2021] <> null, [2022] <> null})), 
  AddImprove = Table.AddColumn(RemoveNulls, "Jumped Rank", each [2021] - [2022]), 
  AddRank = Table.AddRankColumn(
    AddImprove, 
    "Rank", 
    {"Jumped Rank", Order.Descending}, 
    [RankKind = RankKind.Dense]
  ), 
  SelectNClean = Table.SelectColumns(
    Table.SelectRows(AddRank, each [Rank] <= 3), 
    {"Player", "Jumped Rank"}
  )
in
  SelectNClean
Power Query solution 7 for Top Rank Improvements, proposed by Bhavya Gupta:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Ranks = Table.FromRecords(
    Table.TransformRows(
      Table.SelectRows(Source, each not List.Contains(Record.ToList(_), null)), 
      each [Player = [Player], #"Jumped Ranking" = [2021] - [2022]]
    )
  ), 
  ExpectedOutput = Table.Combine(
    Table.FirstN(
      Table.Sort(
        Table.Group(Ranks, {"Jumped Ranking"}, {{"All", each _}}), 
        {{"Jumped Ranking", Order.Descending}}
      ), 
      3
    )[All]
  )
in
  ExpectedOutput
Power Query solution 8 for Top Rank Improvements, proposed by Md. Zohurul Islam:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  a      = Table.AddColumn(Source, "Subtraction", each [2021] - [2022], type number), 
  b      = Table.RemoveColumns(a, {"2021", "2022"}), 
  c      = Table.Sort(b, {{"Subtraction", Order.Descending}}), 
  d      = Table.TransformColumnTypes(c, {{"Player", type text}}), 
  e      = Table.FirstN(c, 4), 
  res    = Table.RenameColumns(e, {{"Subtraction", "Jumped Ranking"}})
in
  res
Power Query solution 9 for Top Rank Improvements, proposed by Krzysztof Kominiak:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  AddDiff = Table.TransformColumns(
    Table.AddColumn(Source, "Jumped Ranking", each List.Skip(Record.ToList(_))), 
    List.Transform({"Jumped Ranking"}, each {_, each _{0} - _{1}})
  ), 
  Result = Table.Sort(
    Table.SelectRows(
      AddDiff, 
      each [2021]
        <> null and [2022]
        <> null and [Jumped Ranking]
        >= List.MaxN(List.Distinct(AddDiff[Jumped Ranking]), 3){2}
    ), 
    {"Jumped Ranking", Order.Descending}
  )[[Player], [Jumped Ranking]]
in
  Result

Solving the challenge of Top Rank Improvements with Excel

Excel solution 1 for Top Rank Improvements, proposed by محمد حلمي:
=LET(
c,B2:B11-IF(C2:C11,C2:C11,99),
SORT(FILTER(
HSTACK(A2:A11,c),c>=LARGE(UNIQUE(c),3)),2,-1))
Excel solution 2 for Top Rank Improvements, proposed by 🇰🇷 Taeyong Shin:
=LET(g,GROUPBY(A2:A11,B2:B11-C2:C11,SUM,,0,-2,MMULT(SIGN(B2:C11),{1;1})-1),c,DROP(g,,1),TAKE(g,XMATCH(3,XMATCH(c,UNIQUE(c)))))
Excel solution 3 for Top Rank Improvements, proposed by 🇰🇷 Taeyong Shin:
=LET(
 p, SIGN(B2:B11 * C2:C11) * (B2:B11 - C2:C11),
 SORT(FILTER(HSTACK(A2:A11, p), p >= LARGE(UNIQUE(p), 3)), 2, -1)
)
Excel solution 4 for Top Rank Improvements, proposed by 🇰🇷 Taeyong Shin:
=LET(
 p, IF(SIGN(B2:B11 * C2:C11), B2:B11 - C2:C11, -99),
 SORT(FILTER(HSTACK(A2:A11, B2:B11), p >= LARGE(UNIQUE(p), 3)), 2, -1)
)
Excel solution 5 for Top Rank Improvements, proposed by Kris Jaganah:
=LET(a,A2:A11,b,B2:B11,c,C2:C11,d,b-c,e,IF(-d=c,0,d),f,IF(e=b,0,d),SORT(FILTER(HSTACK(a,f),f>=LARGE(UNIQUE(f),3)),2,-1))
Excel solution 6 for Top Rank Improvements, proposed by Kris Jaganah:
=LET(a,A2:A11,b,B2:B11,c,C2:C11,d,b-c,e,IF(-d=c,-99,d),f,IF(e=b,-99,d),SORT(FILTER(HSTACK(a,f),f>=LARGE(UNIQUE(f),3)),2,-1))
Excel solution 7 for Top Rank Improvements, proposed by Alejandro Campos:
=LET(
 data, A2:C11,
 filtData, FILTER(data, (ISNUMBER(INDEX(data, , 2))) * (ISNUMBER(INDEX(data, , 3)))),
 improv, MAP(INDEX(filtData, , 2), INDEX(filtData, , 3), LAMBDA(x, y, x - y)),
 sortData, SORTBY(filtData, improv, -1),
 topPlayers, TAKE(sortData, 4),
 HSTACK(INDEX(topPlayers, , 1), MAP(INDEX(topPlayers, , 2), INDEX(topPlayers, , 3), LAMBDA(x, y, x - y)))
)
Excel solution 8 for Top Rank Improvements, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
 _n, 3,
 _d, A2:C11,
 _fd, FILTER(_d, BYROW(_d, LAMBDA(a, AND(a <> "")))),
 _p, TAKE(_fd, , 1),
 _y1, INDEX(_fd, , 2),
 _y2, TAKE(_fd, , -1),
 _df, _y1 - _y2,
 _lg, LARGE(UNIQUE(_df), _n),
 _r, SORT(FILTER(HSTACK(_p, _df), _df >= _lg, ), 2, -1),
 _r
)
Excel solution 9 for Top Rank Improvements, proposed by Timothée BLIOT:
=LET(A, A2:A11,
B, IF((C2:C11<>"")*(B2:B11<>""),B2:B11-C2:C11,"NA"),
C, LARGE(UNIQUE(B),3), 
SORT(FILTER(HSTACK(A,B),(B>=C)*(B<>"NA")),2,-1))
Excel solution 10 for Top Rank Improvements, proposed by Duy Tùng:
=LET(a,B2:C11,b,BYROW(a*{1,-1},SUM)*BYROW(a>0,AND),SORT(FILTER(HSTACK(A2:A11,b),b>LARGE(UNIQUE(b),4)),2,-1))
Excel solution 11 for Top Rank Improvements, proposed by Sunny Baggu:
=SORT(
LET(_col,MAP(B2:B11,C2:C11,LAMBDA(a,b,LET(_r,SEQUENCE(ROWS(a)),
_cond,AND(a>0,b>0,a-b>0),_cond*(a-b)))),
FILTER(HSTACK(A2:A11,_col),_col>0)),2,-1)
Excel solution 12 for Top Rank Improvements, proposed by Md. Zohurul Islam:
=LET(
a,A2:A11,
b,B2:B11,
c,C2:C11,
p,MAP(b,c,LAMBDA(x,y,IF(AND(x>0,y>0),x-y,0))),
q,LARGE(UNIQUE(p),SEQUENCE(3)),
s,XMATCH(p,q),
u,FILTER(HSTACK(a,p),ISNUMBER(s)),
v,SORT(u,2,-1),
w,VSTACK(HSTACK(A1,"Jumped Ranking"),v),
w)
Excel solution 13 for Top Rank Improvements, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=HSTACK(TEXTSPLIT(CONCAT(UNIQUE(MAP(SORT(LET(m;IF(C2:C11<>"";B2:B11-C2:C11;"");MAP(FILTER(A2:A11;(m>0)*(m<>""));LAMBDA(b;XLOOKUP(b;A2:A11;m))));;-1);LAMBDA(h;TEXTJOIN(";";;FILTER(A2:A11;IF(C2:C11<>"";B2:B11-C2:C11;"")=h)))))&";");;";";TRUE;0;"");SORT(LET(m;IF(C2:C11<>"";B2:B11-C2:C11;"");MAP(FILTER(A2:A11;(m>0)*(m<>""));LAMBDA(b;XLOOKUP(b;A2:A11;m))));;-1))
Excel solution 14 for Top Rank Improvements, proposed by Abhishek Kumar Jain:
=LET(a,C2:C11,b,N(IF(a,B2:B11-a)),c,HSTACK(A2:A11,b),SORT(FILTER(c,INDEX(c,,2)>LARGE(UNIQUE(b),4)),2,-1))
Excel solution 15 for Top Rank Improvements, proposed by Guillermo Arroyo:
=LET(_p,A2:A11,_r,B2:C11,_ra,BYROW(_r,LAMBDA(_jr,IF(OR(_jr=""),-9999,SUM(_jr*{1,-1})))),_f,SORT(HSTACK(_p,_ra),2,-1),TAKE(_f,XMATCH(LARGE(UNIQUE(_ra),3),CHOOSECOLS(_f,2))))
Excel solution 16 for Top Rank Improvements, proposed by Rayan S.:
=LET(
 table, FILTER(A2:C11, ((B2:B11 > 0) * (C2:C11 > 0))),
 values, TAKE(table, , -2),
 Yone, TAKE(values, , 1),
 Ytwo, TAKE(values, , -1),
 sol, FILTER(HSTACK(TAKE(table, , 1), Yone - Ytwo), (Yone - Ytwo) > 0),
 SORTBY(sol, TAKE(sol, , -1), -1)
)
Excel solution 17 for Top Rank Improvements, proposed by Stevenson Yu:
=QUERY(A2:C11,"SELECT A, B-C WHERE B-C > 0 ORDER BY B-C DESC LIMIT 4 LABEL A 'Player', B-C 'Jumped Ranking'")

QUERY, one of the things that give Sheets the edge over Excel 👀

Edit: Made it slightly more robust. I'm not hardcoding a 4 anymore!

=QUERY(A2:C11,"SELECT A, B-C WHERE B>0 AND C>0 AND B-C>="&MAX(1,LARGE(UNIQUE(IFERROR(ArrayFormula(IF(B2:B11="","A",B2:B11)-IF(C2:C11="","A",C2:C11)),-99)),3))&" ORDER BY B-C DESC LABEL A 'Player', B-C 'Jumped Ranking'")
Excel solution 18 for Top Rank Improvements, proposed by Surendra Reddy:
=LET(a,B2:B11-C2:C11,b,FILTER(A2:A11,(a>1)*(B2:B11<>"")*(C2:C11<>"")),c,XLOOKUP(b,A2:A11,a),FILTER(SORT(HSTACK(b,c),2,-1),c>=LARGE(UNIQUE(c),3)))
Excel solution 19 for Top Rank Improvements, proposed by Tushar Mehta:
=SORT(CHOOSECOLS(
 FILTER(HSTACK(Table2,Table2[2021]-Table2[2022]),
 LET(deltas,(Table2[2021]<>"")*(Table2[2022]<>"")*(Table2[2021]-Table2[2022]),
 deltas>=LARGE(UNIQUE(deltas),3))
 ),1,4),2,-1)

Solving the challenge of Top Rank Improvements with Python in Excel

Python in Excel solution 1 for Top Rank Improvements, proposed by Alejandro Campos:
df = xl("A1:C11", headers=True)
df = df.dropna(subset=[2021, 2022])
df['Improvement'] = df[2021] - df[2022]
df = df.sort_values(by='Improvement', ascending=False).reset_index(drop=True)
top_4_df = df.head(4)
top_4_df = top_4_df[['Player', 'Improvement']]
top_4_df
                    
                  

&&&

Leave a Reply