List the top 3 players in decreasing order of duration.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 158
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Top Duration Players with Power Query
Power Query solution 1 for Top Duration Players, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Dur = Table.AddColumn(
Source,
"Duration",
each Number.From(Text.End([Years], 4)) - Number.From(Text.Start([Years], 4))
),
Col = Table.SelectColumns(
Table.Sort(
Table.SelectRows(Dur, each [Duration] >= List.Sort(Dur[Duration], 1){2}),
{"Duration", 1}
),
{"Player", "Duration"}
)
in
Col
Power Query solution 2 for Top Duration Players, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
TransformYearsToDuration = Table.TransformColumns(
Source,
{
{
"Years",
each Number.FromText(Text.AfterDelimiter(_, "-"))
- Number.FromText(Text.BeforeDelimiter(_, "-")),
Int32.Type
}
}
),
RenamedToDuration = Table.RenameColumns(TransformYearsToDuration, {{"Years", "Duration"}}),
GroupedByDuration = Table.Group(RenamedToDuration, {"Duration"}, {{"Player", each _[Player]}}),
SortedByDuration = Table.Sort(GroupedByDuration, {{"Duration", Order.Descending}}),
AddedRank = Table.AddIndexColumn(SortedByDuration, "Rank", 1, 1, Int32.Type),
FilteredTop3 = Table.SelectRows(AddedRank, each ([Rank] <= 3)),
Solution = Table.ExpandListColumn(FilteredTop3, "Player")[[Player], [Duration]]
in
Solution
Power Query solution 3 for Top Duration Players, proposed by 🇰🇷 Taeyong Shin:
let
Source = Excel.CurrentWorkbook(){[Name = "tblData"]}[Content],
TransCol = Table.TransformColumns(
Source,
{
"Years",
each Number.From(Text.AfterDelimiter(_, "-")) - Number.From(Text.BeforeDelimiter(_, "-"))
},
Text.From
),
RenameCol = Table.RenameColumns(TransCol, {{"Years", "Duration"}}),
Result =
let
n = List.Last(List.MaxN(List.Distinct(RenameCol[Duration]), 3))
in
Table.MaxN(RenameCol, "Duration", each [Duration] >= n)
in
Result
Power Query solution 4 for Top Duration Players, proposed by Kris Jaganah:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Split" = Table.SplitColumn(
Source,
"Years",
Splitter.SplitTextByDelimiter("-", QuoteStyle.None),
{"Years.1", "Years.2"}
),
#"Changed" = Table.TransformColumnTypes(
#"Split",
{{"Years.1", Int64.Type}, {"Years.2", Int64.Type}}
),
#"Custom" = Table.AddColumn(#"Changed", "Duration", each [Years.2] - [Years.1]),
#"Removed Columns" = Table.RemoveColumns(#"Custom", {"Years.1", "Years.2"}),
#"Sorted" = Table.Sort(#"Removed Columns", {{"Duration", Order.Descending}}),
#"Index" = Table.AddIndexColumn(#"Sorted", "Index", 1, 1, Int64.Type),
#"Grouped" = Table.Group(
#"Index",
{"Duration"},
{
{"All", each _, type table [Player = text, Duration = number, Index = number]},
{"Rank", each List.Min([Index]), type number}
}
),
#"Expanded" = Table.ExpandTableColumn(#"Grouped", "All", {"Player"}, {"Player"}),
#"Filtered" = Table.SelectRows(#"Expanded", each [Rank] <= 3),
#"Reordered" = Table.ReorderColumns(#"Filtered", {"Player", "Duration", "Rank"}),
#"Removed" = Table.RemoveColumns(#"Reordered", {"Rank"})
in
#"Removed"
Power Query solution 5 for Top Duration Players, proposed by Aditya Kumar Darak 🇮🇳:
let
Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content],
TopN = 3,
Duration = Table.AddColumn(
Source,
"Duration",
each Expression.Evaluate("-" & Text.Replace([Years], "-", "+"))
),
Group = Table.Group(Duration, "Duration", {"All", each [[Player], [Duration]]}),
Select = Table.MaxN(Group, "Duration", TopN),
Return = Table.Combine(Select[All])
in
Return
Power Query solution 6 for Top Duration Players, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Add = Table.AddColumn(
Source,
"Duration",
each
let
a = List.Transform(Text.Split([Years], "-"), Number.From),
b = List.Count({a{0} .. a{1}}) - 1
in
b
),
Filter = List.Last(List.FirstN(List.Sort(List.Distinct(Add[Duration]), Order.Descending), 3)),
App = Table.SelectRows(Add, each ([Duration] >= Filter)),
Sol = Table.Sort(App, {{"Duration", Order.Descending}, {"Player", Order.Ascending}})[
[Player],
[Duration]
]
in
Sol
Power Query solution 7 for Top Duration Players, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
tab = Table.TransformColumns(Fonte, {{"Years", each Expression.Evaluate(_) * - 1, type number}}),
top3 = List.MaxN(tab[Years], 3),
res = Table.Sort(
Table.SelectRows(tab, each List.Contains(top3, [Years])),
each List.PositionOf(top3, [Years])
)
in
res
Power Query solution 9 for Top Duration Players, proposed by Jaroslaw Kujawa:
let
Source = Excel.CurrentWorkbook(){[Name=Table30]}[Content],
hashtag#Split Column by Delimiter = Table.SplitColumn(Source, Years, Splitter.SplitTextByDelimiter(-, QuoteStyle.Csv), {Years.1, Years.2}),
hashtag#Added Custom = Table.AddColumn(hashtag#Split Column by Delimiter, Custom, each Number.From([Years.2])-Number.From([Years.1])),
Custom1 = Table.AddRankColumn( hashtag#Added Custom,Rank,{Custom,Order.Descending},[RankKind=RankKind.Competition]),
hashtag#Filtered Rows = Table.SelectRows(Custom1, each ([Rank] = 3)),
hashtag#Removed Columns = Table.RemoveColumns(hashtag#Filtered Rows,{Years.1, Years.2, Rank}),
hashtag#Reordered Columns = Table.ReorderColumns(hashtag#Removed Columns,{Custom, Player}),
hashtag#Sorted Rows = Table.Sort(hashtag#Reordered Columns,{{Custom, Order.Descending}, {Player, Order.Ascending}}),
hashtag#Reordered Columns1 = Table.ReorderColumns(hashtag#Sorted Rows,{Player, Custom})
in
hashtag#Reordered Columns1
Power Query solution 10 for Top Duration Players, proposed by Sue Bayes:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Split = Table.SplitColumn(
Source,
"Years",
Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv),
{"Years.1", "Years.2"}
),
Type = Table.TransformColumnTypes(Split, {{"Years.1", Int64.Type}, {"Years.2", Int64.Type}}),
Difference = Table.AddColumn(Type, "Difference", each [Years.2] - [Years.1], Int64.Type)[
[Player],
[Difference]
],
Rank = Table.AddRankColumn(
Difference,
"Rank",
{"Difference", Order.Descending},
[RankKind = RankKind.Dense]
),
Filter = Table.SelectRows(Rank, each [Rank] < 4)[[Player], [Difference]]
in
Filter
Power Query solution 11 for Top Duration Players, proposed by Vinay BN:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
SplitColumn = Table.SplitColumn(
Source,
"Years",
Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv),
{"Start", "End"}
),
ChangedType = Table.TransformColumnTypes(
SplitColumn,
{{"Start", Int64.Type}, {"End", Int64.Type}, {"Player", type text}}
),
Subtract = Table.AddColumn(ChangedType, "Duration", each [End] - [Start], Int64.Type),
SortDuration = Table.Sort(Subtract, {{"Duration", Order.Descending}}),
Top5 = Table.FirstN(SortDuration, 5),
SelectColumns = Table.SelectColumns(Top5, {"Player", "Duration"})
in
SelectColumns
Solving the challenge of Top Duration Players with Excel
Excel solution 1 for Top Duration Players, proposed by Bo Rydobon 🇹🇭:
=LET(x,B2:B20,y,RIGHT(x,4)-LEFT(x,4),SORT(FILTER(HSTACK(A2:A20,y),y>=LARGE(y,3)),2,-1))
Excel solution 2 for Top Duration Players, proposed by Rick Rothstein:
=LET(b,B2:B20,y,RIGHT(b,4)-LEFT(b,4),SORT(FILTER(HSTACK(A2:A20,y),y>LARGE(UNIQUE(y),4)),2,-1))
Excel solution 3 for Top Duration Players, proposed by John V.:
=LET(y,B2:B20,d,RIGHT(y,4)-LEFT(y,4),SORT(FILTER(HSTACK(A2:A20,d),d>=LARGE(d,3)),2,-1))
Excel solution 4 for Top Duration Players, proposed by محمد حلمي:
=LET(
b,B2:B20,
v,TEXTAFTER(b,"-")-TEXTSPLIT(b,"-"),
SORT(FILTER(HSTACK(A2:A20,v),
v>=LARGE(UNIQUE(v),3)),2,-1))
Excel solution 5 for Top Duration Players, proposed by 🇰🇷 Taeyong Shin:
=LET(y,B2:B20&"i",d,-IMAGINARY(y)-IMREAL(y),GROUPBY(A2:A20,d,SUM,,0,-2,d>=LARGE(UNIQUE(d),3)))
Excel solution 6 for Top Duration Players, proposed by Kris Jaganah:
=LET(a,A2:A20,b,B2:B20,c,RIGHT(b,4)-LEFT(b,4),SORT(FILTER(HSTACK(a,c),c>=LARGE(c,3)),2,-1))
Excel solution 7 for Top Duration Players, proposed by Julian Poeltl:
=LET(P,A2:A20,Y,B2:B20,D,TEXTAFTER(Y,"-")-TEXTBEFORE(Y,"-"),SORT(FILTER(HSTACK(P,D),D>LARGE(UNIQUE(D),4)),2,-1))
Excel solution 8 for Top Duration Players, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
_n, 3,
_d, A2:B20,
_pl, TAKE(_d, , 1),
_y, TAKE(_d, , -1),
_du, MAP(_y, LAMBDA(a, SUM(TEXTSPLIT(a, "-") * {-1, 1}))),
_udu, UNIQUE(_du),
_lg, LARGE(_udu, _n),
_r, SORT(FILTER(HSTACK(_pl, _du), _du >= _lg), 2, -1),
_r
)
Excel solution 9 for Top Duration Players, proposed by Timothée BLIOT:
=LET(A, BYROW(B2:B20, LAMBDA(x, (RIGHT(x,4)*1)-(LEFT(x,4)*1) )),
SORT(FILTER(HSTACK(A2:A20,A),A>=LARGE(UNIQUE(A),3)),2,-1) )
Excel solution 10 for Top Duration Players, proposed by Hussein SATOUR:
=LET(
y,
A2:A20,
a,
RIGHT(
y,
4
)-LEFT(
y,
4
),
b,
SORT(
HSTACK(
B2:B20,
a
),
2,
-1
),
FILTER(
b,
SORT(
a,
,
-1
) > LARGE(
UNIQUE(
a
),
4
)
)
)
Excel solution 11 for Top Duration Players, proposed by Oscar Mendez Roca Farell:
=LET(_d, REDUCE("Duration",B2:B20, LAMBDA(i, x, VSTACK(i, SUM(TEXTSPLIT(x,"-")*{-11})))), TAKE(ORDER(HSTACK(A1:A20,_d),2,-1),SUM(N(_d>=LARGE(_d,3)))))
Excel solution 12 for Top Duration Players, proposed by Sunny Baggu:
=LET(
_tbl,
SORT(
HSTACK(
A2:A20,
TEXTAFTER(
B2:B20,
"-"
)-TEXTBEFORE(
B2:B20,
"-"
)
),
2,
-1
),
_cri,
TAKE(
_tbl,
,
-1
)>=LARGE(
TAKE(
_tbl,
,
-1
),
3
),
FILTER(
_tbl,
_cri
)
)
Excel solution 13 for Top Duration Players, proposed by Md. Zohurul Islam:
=LET(u,A2:A20,v,B2:B20,hdr,{"Players","Duration"},
a,MAP(v,LAMBDA(x,SUM(TEXTSPLIT(x,"-")*{-1,1}))),
b,SORT(FILTER(HSTACK(u,a),a>=LARGE(a,3)),2,-1),
VSTACK(hdr,b))
Excel solution 14 for Top Duration Players, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=LET(q;C2:C20;w;A2:A20;HSTACK(VSTACK(MAP(E2:E3;LAMBDA(j;LET(m;IFERROR(MAP(q;w;LAMBDA(x;y;XLOOKUP(j;x;y)));"");FILTER(m;m<>""))));LET(m;IFERROR(MAP(q;w;LAMBDA(x;y;XLOOKUP(E4;x;y)));"");FILTER(m;m<>"")));LARGE(q;ROW(INDIRECT("A1:"&"A"&SUM(COUNTIF(q;LARGE(q;ROW(A1:A3)))))))))
Excel solution 15 for Top Duration Players, proposed by Guillermo Arroyo:
=LET(b,MMULT(--MID(B2:B20,{1,6},4),{-1;1}),SORT(FILTER(HSTACK(A2:A20,b),b>=LARGE(UNIQUE(b),3)),2,-1))
Excel solution 16 for Top Duration Players, proposed by Quadri Olayinka Atharu:
=LET(a,--TEXTBEFORE(B2:B20,"-"),b,--TEXTAFTER(B2:B20,"-"),d,b-a,topn,
LARGE(UNIQUE(d),3),VSTACK({"Players","Duration"},TAKE(SORT(HSTACK(A2:A20,d),2,-1),SUM(N(d>=topn)))))
Excel solution 17 for Top Duration Players, proposed by Quadri Olayinka Atharu:
=LET(a,--TEXTBEFORE(B2:B20,"-"),b,--TEXTAFTER(B2:B20,"-"),d,b-a,topn,
LARGE(UNIQUE(d),3),VSTACK({"Players","Duration"},SORT(FILTER(HSTACK(A2:A20,d),d>=topn),2,-1)))
Excel solution 18 for Top Duration Players, proposed by Anup Kumar:
=LET(
plrs,A2:A20,
yrs,B2:B20,
durn,--RIGHT(yrs,4)-(--LEFT(yrs,4)),
lrg,LARGE(durn,3),
VSTACK({"Players","Duration"},SORT(FILTER(HSTACK(plrs,durn),durn>=lrg),2,-1))
)
Solving the challenge of Top Duration Players with Python in Excel
players_data = xl("A2:B20").values
df = pd.DataFrame(players_data, columns=["Player", "Years"])
df['Start Year'] = df['Years'].apply(lambda x: int(x.split('-')[0]))
df['End Year'] = df['Years'].apply(lambda x: int(x.split('-')[1]))
df['Duration'] = df['End Year'] - df['Start Year']
top_3_players = df.nlargest(5, 'Duration')[['Player', 'Duration']].set_index('Player').reset_index()
top_3_players
Solving the challenge of Top Duration Players with DAX
&&
