— This week will be FIFA World Cup week. All challenges will be related to FIFA World Cup only for this week. — Given are ELO ranking for Nov-21 and Nov-22 for FIFA teams. Find the countries which had the best and worst improvement in rankings. Morocco improved by 24 ranks which was the best and Belgium and Ecuador had worst improvement by -5 ranks.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 77
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Best and Worst Rank Changes with Power Query
Power Query solution 1 for Best and Worst Rank Changes, proposed by Kris Jaganah:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(
Source,
{{"Nov-22 Rank", Int64.Type}, {"Team", type text}, {"Nov-21 Rank", Int64.Type}}
),
#"Added Custom" = Table.AddColumn(
#"Changed Type",
"Custom",
each [#"Nov-21 Rank"] - [#"Nov-22 Rank"]
),
#"Added Conditional Column" = Table.AddColumn(
#"Added Custom",
"Custom.1",
each if [Custom] > 0 then "Best" else if [Custom] < 0 then "Worst" else null
),
#"Removed Columns" = Table.RemoveColumns(
#"Added Conditional Column",
{"Nov-21 Rank", "Nov-22 Rank"}
),
#"Reordered Columns" = Table.ReorderColumns(#"Removed Columns", {"Custom.1", "Team", "Custom"}),
#"Filtered Rows" = Table.SelectRows(#"Reordered Columns", each ([Custom] = - 5 or [Custom] = 24)),
#"Sorted Rows" = Table.Sort(#"Filtered Rows", {{"Custom", Order.Descending}})
in
#"Sorted Rows"Power Query solution 2 for Best and Worst Rank Changes, proposed by Luan Rodrigues:
let
Fonte = Data,
a = Table.AddColumn(Fonte, "Personalizar", each [#"Nov-21 Rank"] - [#"Nov-22 Rank"]),
b = Table.AddColumn(a, "Personalizar.1", each 0),
g = Table.Group(
b,
{"Personalizar.1"},
{
{"Contagem", each List.MaxN(_[Personalizar], 1){0}},
{"Min", each List.MinN(_[Personalizar], 1){0}},
{"tab", each _}
}
),
e = Table.ExpandTableColumn(g, "tab", {"Team", "Personalizar"}, {"Team", "Improved by"}),
Result = Table.Sort(
Table.SelectRows(
Table.AddColumn(
e,
"Category",
each
if [Contagem] = [Improved by] then
"Best"
else if [Improved by] = [Min] then
"Worst"
else
false
),
each [Category] <> false
),
{"Improved by", Order.Descending}
)[[Category], [Team], [Improved by]]
in
ResultPower Query solution 3 for Best and Worst Rank Changes, proposed by Brian Julius:
let
Source = Table.TransformColumnTypes(
ImproveRaw,
{{"Nov-22 Rank", Int64.Type}, {"Nov-21 Rank", Int64.Type}}
),
Improvement = Table.RemoveColumns(
Table.AddColumn(Source, "Improved by", each [#"Nov-21 Rank"] - [#"Nov-22 Rank"]),
{"Nov-22 Rank", "Nov-21 Rank"}
),
Max = List.Max(Improvement[Improved by]),
Min = List.Min(Improvement[Improved by]),
Category = Table.AddColumn(
Improvement,
"Category",
each if [Improved by] = Min then "Worst" else if [Improved by] = Max then "Best" else "Mid"
),
Filter = Table.SelectRows(Category, each ([Category] <> "Mid")),
ReorderSort = Table.Sort(
Table.ReorderColumns(Filter, {"Category", "Team", "Improved by"}),
{{"Category", Order.Ascending}, {"Team", Order.Ascending}}
)
in
ReorderSortPower Query solution 4 for Best and Worst Rank Changes, proposed by Bhavya Gupta:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Improvement = Table.AddColumn(Source, "Improved By", each [#"Nov-21 Rank"] - [#"Nov-22 Rank"])[
[Team],
[Improved By]
],
Grouped = Table.Group(Improvement, {"Improved By"}, {{"Team", each [Team]}})[
[Team],
[Improved By]
],
Sorted = Table.ToRows(Table.Sort(Grouped, {{"Improved By", Order.Descending}})),
Custom = Table.FromRecords(
List.Transform(
List.Split(List.Combine({{"Best"}, List.First(Sorted), {"Worst"}, List.Last(Sorted)}), 3),
each Record.FromList(_, {"Category", "Team", "Improved By"})
)
),
ExpectedOutput = Table.ExpandListColumn(Custom, "Team")
in
ExpectedOutputPower Query solution 5 for Best and Worst Rank Changes, proposed by Victor Wang:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Recs = List.Transform(
Table.ToRecords(Source),
each [Team = [Team]] & [r = [#"Nov-21 Rank"] - [#"Nov-22 Rank"]]
),
Finish =
let
min = List.Min(Recs, 0, each [r])[r],
max = List.Max(Recs, 0, each [r])[r]
in
Table.RenameColumns(
Table.FromRecords(
List.Transform(List.Select(Recs, each [r] = max), each [Category = "Best"] & _)
& List.Transform(List.Select(Recs, each [r] = min), each [Category = "Worst"] & _)
),
{"r", "Improved by"}
)
in
FinishPower Query solution 6 for Best and Worst Rank Changes, proposed by Venkata Rajesh:
let
Source = Data,
ImprovedBy = Table.AddColumn(
Source,
"Improved by",
each [#"Nov-21 Rank"] - [#"Nov-22 Rank"],
Int64.Type
),
Category = Table.AddColumn(
ImprovedBy,
"Category",
each
if [Improved by] = List.Max(#"ImprovedBy"[Improved by]) then
"Best"
else if [Improved by] = List.Min(#"ImprovedBy"[Improved by]) then
"Worst"
else
null,
Text.Type
),
#"Filtered Rows" = Table.SelectRows(Category, each ([Category] <> null))[
[Category],
[Team],
[Improved by]
],
#"Sorted Rows" = Table.Sort(
#"Filtered Rows",
{{"Category", Order.Ascending}, {"Team", Order.Ascending}}
)
in
#"Sorted Rows"Power Query solution 7 for Best and Worst Rank Changes, proposed by Mahmoud Bani Asadi:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Subtract = Table.AddColumn(
Source,
"Improved By",
each [#"Nov-21 Rank"] - [#"Nov-22 Rank"],
type number
),
MinMax = Table.Combine(
{Table.MaxN(Subtract, "Improved By", each [Improved By] = List.Max(Subtract[Improved By]))}
& {Table.MinN(Subtract, "Improved By", each [Improved By] = List.Min(Subtract[Improved By]))}
),
Category = Table.AddColumn(
MinMax,
"Category",
each if [Improved By] = List.Max(Subtract[Improved By]) then "Best" else "Worst"
)[[Category], [Team], [Improved By]]
in
CategoryPower Query solution 8 for Best and Worst Rank Changes, proposed by Deron Huskey:
let
Source = Excel.CurrentWorkbook(){[Name = "ELORankings"]}[Content],
DefaultChange = Table.TransformColumnTypes(
Source,
{{"Nov-22 Rank", Int64.Type}, {"Team", type text}, {"Nov-21 Rank", Int64.Type}}
),
AddImprovedBy = Table.AddColumn(
DefaultChange,
"Improved By",
each [#"Nov-21 Rank"] - [#"Nov-22 Rank"]
),
ChangeImprovedByToWholeNumber = Table.TransformColumnTypes(
AddImprovedBy,
{{"Improved By", Int64.Type}}
),
AddCategory = Table.AddColumn(
ChangeImprovedByToWholeNumber,
"Category",
each
if [Improved By] = List.Min(ChangeImprovedByToWholeNumber[Improved By]) then
"Worst"
else if [Improved By] = List.Max(ChangeImprovedByToWholeNumber[Improved By]) then
"Best"
else
null
),
DropOtherCols = Table.SelectColumns(AddCategory, {"Category", "Team", "Improved By"}),
ExcludeNulls = Table.SelectRows(DropOtherCols, each ([Category] <> null)),
SortByCategoryTeam = Table.Sort(
ExcludeNulls,
{{"Category", Order.Ascending}, {"Team", Order.Ascending}}
)
in
SortByCategoryTeamPower Query solution 9 for Best and Worst Rank Changes, proposed by Emil M.:
let
Source = Excel.Workbook(File.Contents("C:DownloadsElo Ratings.xlsx"), null, true),
Sheet2_Sheet = Source{[Item = "Sheet2", Kind = "Sheet"]}[Data],
#"Removed Other Columns" = Table.SelectColumns(Sheet2_Sheet, {"Column3", "Column2", "Column1"}),
#"Promoted Headers" = Table.PromoteHeaders(#"Removed Other Columns", [PromoteAllScalars = true]),
Change = Table.AddColumn(
#"Promoted Headers",
"Improved By",
each [#"Nov-21 Rank"] - [#"Nov-22 Rank"],
type number
),
#"Result" = Table.Sort(
Table.SelectRows(
Change,
each (
if [Improved By] = List.Min(Change[Improved By]) then
"Min"
else if [Improved By] = List.Max(Change[Improved By]) then
"Max"
else
null
)
<> null
),
{{"Improved By", Order.Descending}}
)
in
#"Result"
Solving the challenge of Best and Worst Rank Changes with Excel
Excel solution 1 for Best and Worst Rank Changes, proposed by Rick Rothstein:
=LET(d,
C2:C21-A2:A21,
m,
MAX(
d
),
n,
MIN(
d
),
SORT(FILTER(HSTACK(
IF(
d=m,
"Best",
"Worst"
),
B2:B21,
d
),
m*(d=m)+n*(d=n)),
1))
Exploded View
-----------------------------------------------
=LET(
diff,
C2:C21 - A2:A21,
maximum,
MAX(
diff
),
minimum,
MIN(
diff
),
SORT(
FILTER(
HSTACK(
IF(
diff = maximum,
"Best",
"Worst"
),
B2:B21,
diff
),
IF(
diff = maximum,
maximum,
IF(
diff = minimum,
minimum
)
)
),
1
)
)
Excel solution 2 for Best and Worst Rank Changes, proposed by John V.:
=LET(t,B2:B21,d,C2:C21-A2:A21,VSTACK(FILTER(HSTACK(MID("Best"&t,{1,5},{4,99}),d),d=MAX(d)),FILTER(HSTACK(MID("Worst"&t,{1,6},{5,99}),d),d=MIN(d))))
► The "short" one (shortening Rick Rothstein formula):
=LET(d,C2:C21-A2:A21,c,d=MAX(d),SORT(FILTER(HSTACK(IF(c,"Best","Worst"),B2:B21,d),c+(d=MIN(d)))))
Excel solution 3 for Best and Worst Rank Changes, proposed by 🇰🇷 Taeyong Shin:
=LET(
d,
C2:C21-A2:A21,
F,
LAMBDA(
x,
fn,
FILTER(
CHOOSE(
{1,
2,
3},
x,
B2:B21,
d
),
d=fn(
d
)
)
),
VSTACK(
F(
"Best",
MAX
),
F(
"Worst",
MIN
)
)
)
Excel solution 4 for Best and Worst Rank Changes, proposed by Kris Jaganah:
=LET(
a,
HSTACK(
IF(
C2:C21-A2:A21>0,
"Better",
"Worst"
),
B2:B21,
C2:C21-A2:A21
),
b,
CHOOSECOLS(
a,
3
),
VSTACK(
FILTER(
a,
b=LARGE(
b,
1
)
),
FILTER(
a,
b=SMALL(
b,
1
)
)
)
)
Excel solution 5 for Best and Worst Rank Changes, proposed by Kris Jaganah:
=LET(
a,
A2:A21,
b,
B2:B21,
c,
C2:C21,
d,
HSTACK(
b,
c-a
),
e,
HSTACK(
IF(
CHOOSECOLS(
d,
2
)>0,
"Best",
"Worst"
),
d
),
f,
FILTER(
e,
CHOOSECOLS(
e,
3
)=LARGE(
CHOOSECOLS(
e,
3
),
1
)
),
g,
FILTER(
e,
CHOOSECOLS(
e,
3
)=SMALL(
CHOOSECOLS(
e,
3
),
1
)
),
VSTACK(
f,
g
)
)
Excel solution 6 for Best and Worst Rank Changes, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
_d,
A2:C21,
_cr,
INDEX(
_d,
,
1
),
_pr,
INDEX(
_d,
,
3
),
_t,
INDEX(
_d,
,
2
),
_s,
_pr - _cr,
_e,
LAMBDA(
a,
b,
IFNA(
FILTER(
HSTACK(
b,
_t,
_s
),
_s = a
),
b
)
),
_b,
_e(
MAX(
_s
),
"Best"
),
_w,
_e(
MIN(
_s
),
"Worst"
),
_r,
VSTACK(
_b,
_w
),
_r
)
Excel solution 7 for Best and Worst Rank Changes, proposed by Timothée BLIOT:
=LET(Teams,B2:B21,Improvements,C2:C21-A2:A21,
Ordered,SORT(HSTACK(Teams,Improvements),2,-1),
BestWorst,FILTER(Ordered,--(MAX(INDEX(Ordered,,2))=INDEX(Ordered,,2))+--(MIN(INDEX(Ordered,,2))=INDEX(Ordered,,2))),
HSTACK(IF(INDEX(BestWorst,,2)=MAX(INDEX(BestWorst,,2)),"Max","Worst"),BestWorst))
Excel solution 8 for Best and Worst Rank Changes, proposed by Charles Roldan:
=LET(
Team, B2:B21,
ΔR, C2:C21 - A2:A21,
Tag, XLOOKUP(ΔR, VSTACK(MAX(ΔR), MIN(ΔR)), {"Best";"Worst"}, ""),
SORT(FILTER(HSTACK(Tag, Team, ΔR), LEN(Tag)), 3, -1))
Excel solution 9 for Best and Worst Rank Changes, proposed by Owen Price:
=LET(
d,
$A$2:$C$21,
diff,
INDEX(
d,
,
3
)-INDEX(
d,
,
1
),
min,
MIN(
diff
),
max,
MAX(
diff
),
label,
IFS(
diff=min,
"Worst",
diff=max,
"Best",
TRUE,
""
),
filt,
SORT(
FILTER(
HSTACK(
label,
INDEX(
d,
,
2
),
diff
),
label<>""
),
3,
-1
),
VSTACK(
{"Category",
"Team",
"Improved by"},
filt
)
)
Excel solution 10 for Best and Worst Rank Changes, proposed by Stefan Olsson:
={
SORTN(
{B2:B21,
C2:C21-A2:A21},
1,
3,
2,
FALSE
);
SORTN(
{B2:B21,
C2:C21-A2:A21},
1,
3,
2,
TRUE
)
Excel &solution 11 for Best and Worst Rank Changes, proposed by Victor Momoh (MVP, MOS, R.Eng):
=LET(
a,
C2:C21-A2:A21,
b,
HSTACK(
B2:B21,
a
),
c,
"Best",
d,
"Worst",
VSTACK(
IFNA(
HSTACK(
c,
FILTER(
b,
a=MAX(
a
)
)
),
c
),
IFNA(
HSTACK(
d,
FILTER(
b,
a=MIN(
a
)
)
),
d
)
)
)
Excel solution 12 for Best and Worst Rank Changes, proposed by Paolo Pozzoli:
=LET(teams;B2:B21;
diff;C2:C21-A2:A21;
hstack;STACK.ORIZ(teams;diff);
output;STACK.VERT(SE.NON.DISP.(STACK.ORIZ("Best";FILTRO(hstack;SCEGLI.COL(hstack;2)=MAX(diff)));"Best");SE.NON.DISP.(STACK.ORIZ("Worst";FILTRO(hstack;SCEGLI.COL(hstack;2)=MIN(diff)));"Worst"));
output)
Solving the challenge of Best and Worst Rank Changes with DAX
DAX solution 1 for Best and Worst Rank Changes, proposed by Zoran Milokanović:
EVALUATE
SELECTCOLUMNS(
FILTER(
ADDCOLUMNS(Input,
"I", Input[Nov-21 Rank] - Input[Nov-22 Rank],
"T", RANKX(Input, Input[Nov-21 Rank] - Input[Nov-22 Rank], , DESC, Dense),
"B", RANKX(Input, Input[Nov-21 Rank] - Input[Nov-22 Rank], , ASC, Dense)
),
OR([T] = 1, [B] = 1)
),
"Category", IF([T] = 1, "Best", "Worst"),
Input[Team],
"Improved by", [I]
)
ORDER BY
[Category], Input[Team]
Solving the challenge of Best and Worst Rank Changes with SQL
SQL solution 1 for Best and Worst Rank Changes, proposed by Zoran Milokanović:
SELECT
F.CATEGORY
, F.TEAM
,F.IMPROVED_BY
FROM
(
SELECT
DECODE(SIGN(D.NOV_21_RANK - D.NOV_22_RANK), -1, 'Worst', 'Best') AS CATEGORY
, D.TEAM
,D.NOV_21_RANK - D.NOV_22_RANK AS IMPROVED_BY
,RANK() OVER (PARTITION BY
DECODE(SIGN(D.NOV_21_RANK - D.NOV_22_RANK), -1, 'Worst', 'Best')
ORDER BY ABS(D.NOV_21_RANK - D.NOV_22_RANK) DESC) AS TOP_N
FROM DATA D
) F
WHERE
F.TOP_N = 1
ORDER BY
1, 2
;
