Find when the Min and Max occurred for various months and corresponding dates.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 99
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Find Monthly Min Max Dates with Power Query
Power Query solution 1 for Find Monthly Min Max Dates, proposed by Zoran Milokanović:
let
Source = Table.AddColumn(
Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
"Month",
each Text.Start(Date.MonthName([Date], "en-US"), 3)
),
Get = (t, f) =>
Text.Combine(
List.Transform(
Table.SelectRows(t, each [Amount] = List.Sort(t[Amount], f){0})[Date],
each Date.ToText(Date.From(_), "yyyy-MM-dd")
),
", "
),
S = Table.Group(
Source,
{"Month"},
{
{"Min", each List.Min([Amount])},
{"Min Date", each Get(_, 0)},
{"Max", each List.Max([Amount])},
{"Max Date", each Get(_, - 1)}
}
)
in
S
Power Query solution 2 for Find Monthly Min Max Dates, proposed by Kris Jaganah:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Change = Table.TransformColumnTypes(Source, {{"Date", type date}, {"Amount", Int64.Type}}),
Month = Table.AddColumn(Change, "Month", each Date.ToText([Date], "MMM")),
Group = Table.Group(
Month,
{"Month"},
{
{"Min", each List.Min([Amount]), type nullable number},
{"Max", each List.Max([Amount]), type nullable number},
{"All", each _, type table [Date = nullable date, Amount = nullable number, Month = text]}
}
),
Expand = Table.ExpandTableColumn(Group, "All", {"Date", "Amount"}, {"All.Date", "All.Amount"}),
MinDate = Table.AddColumn(
Expand,
"MinDate",
each if [All.Amount] = [Min] then Date.ToText([All.Date], [Format = "yyyy-MM-dd"]) else null
),
MaxDate = Table.AddColumn(
MinDate,
"MaxDate",
each if [All.Amount] = [Max] then Date.ToText([All.Date], [Format = "yyyy-MM-dd"]) else null
),
Grouped = Table.Group(
MaxDate,
{"Month"},
{
{"Min", each List.Min([Min]), type nullable number},
{"Min Date", each Text.Combine([MinDate], ", "), type nullable text},
{"Max", each List.Max([Max]), type nullable number},
{"Max Date", each Text.Combine([MaxDate], ", "), type nullable text}
}
)
in
Grouped
Power Query solution 3 for Find Monthly Min Max Dates, proposed by Aditya Kumar Darak 🇮🇳:
let
Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content],
Date = Table.AddColumn(Source, "New Date", each DateTime.ToText([Date], "yyyy-MM-dd")),
Month = Table.AddColumn(Date, "Month", each DateTime.ToText([Date], "MMM"), type text),
Return = Table.Group(
Month,
{"Month"},
{
{"Min", each List.Min([Amount])},
{
"Min Date",
each Text.Combine(
Table.SelectRows(_, (f) => f[Amount] = List.Min([Amount]))[New Date],
", "
)
},
{"Max", each List.Max([Amount])},
{
"Max Date",
each Text.Combine(
Table.SelectRows(_, (f) => f[Amount] = List.Max([Amount]))[New Date],
", "
)
}
}
)
in
Return
Power Query solution 4 for Find Monthly Min Max Dates, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Month = Table.AddColumn(Source, "Month", each Text.Start(Date.MonthName(Date.From([Date])), 3)),
Sol = Table.Group(
Month,
{"Month"},
{
{"Min", each List.Min([Amount])},
{
"Min Date",
each
let
a = Table.ToColumns(_),
b = List.Min(a{1}),
c = List.PositionOf(a{1}, b, Occurrence.All)
in
Text.Combine(
List.Transform(c, each Date.ToText(Date.From(a{0}{_}), [Format = "yyyy-MM-dd"])),
", "
)
},
{"Max", each List.Max([Amount])},
{
"Max Date",
each
let
a = Table.ToColumns(_),
b = List.Max(a{1}),
c = List.PositionOf(a{1}, b, Occurrence.All)
in
Text.Combine(
List.Transform(c, each Date.ToText(Date.From(a{0}{_}), [Format = "yyyy-MM-dd"])),
", "
)
}
}
)
in
Sol
Power Query solution 5 for Find Monthly Min Max Dates, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
m = Table.AddColumn(Fonte, "Month", each Date.ToText(Date.From([Date]), "MMM")),
gp = Table.Group(
m,
{"Month"},
{
{
"Contagem",
each [
Min = List.Min(_[Amount]),
#"Min Date" = Text.Combine(
List.Transform(
Table.SelectRows(_, each [Amount] = Min)[Date],
each Date.ToText(Date.From(_, "en-US"), "yyyy-MM-dd")
),
", "
),
Max = List.Max(_[Amount]),
#"Max Date" = Text.Combine(
List.Transform(
Table.SelectRows(_, each [Amount] = Max)[Date],
each Date.ToText(Date.From(_, "en-US"), "yyyy-MM-dd")
),
", "
)
]
}
}
),
res = Table.ExpandRecordColumn(gp, "Contagem", Record.FieldNames(gp[Contagem]{0}))
in
res
Power Query solution 6 for Find Monthly Min Max Dates, proposed by Matthias Friedmann:
let
Source = Excel.CurrentWorkbook(){[Name = "MinMaxDate"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(
Source,
{{"Date", type date}, {"Amount", Int64.Type}}
),
#"Inserted Month Name" = Table.AddColumn(
#"Changed Type",
"Month",
each Text.Start(Date.MonthName([Date]), 3),
type text
),
#"Changed Type1" = Table.TransformColumnTypes(#"Inserted Month Name", {{"Date", type text}}),
#"Grouped Rows" = Table.Group(
#"Changed Type1",
{"Month"},
{
{"Min", each List.Min([Amount]), type nullable number},
{
"Min Date",
each
let
min = List.Min([Amount])
in
Text.Combine(Table.SelectRows(_, each [Amount] = min)[Date], ", ")
},
{"Max", each List.Max([Amount]), type nullable number},
{
"Max Date",
each
let
max = List.Max([Amount])
in
Text.Combine(Table.SelectRows(_, each [Amount] = max)[Date], ", ")
}
}
)
in
#"Grouped Rows"
Power Query solution 7 for Find Monthly Min Max Dates, proposed by Sandeep Marwal:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Changed Type1" = Table.TransformColumnTypes(Source, {{"Date", type date}}),
S1 = Table.AddColumn(#"Changed Type1", "Month Name", each Date.MonthName([Date]), type text),
#"Changed Type" = Table.TransformColumnTypes(S1, {{"Date", type text}}),
#"Grouped Rows" = Table.Group(
#"Changed Type",
{"Month Name"},
{{"Min", each List.Min([Amount]), type number}, {"Max", each List.Max([Amount]), type number}}
),
#"Merged Queries" = Table.NestedJoin(
#"Grouped Rows",
{"Month Name", "Min"},
#"Changed Type",
{"Month Name", "Amount"},
"Min Date",
JoinKind.LeftOuter
),
Custom1 = Table.TransformColumns(#"Merged Queries", {"Min Date", each Text.Combine(_[Date], ",")}),
Custom2 = Table.NestedJoin(
Custom1,
{"Month Name", "Max"},
#"Changed Type",
{"Month Name", "Amount"},
"Max Date",
JoinKind.LeftOuter
),
Custom3 = Table.TransformColumns(Custom2, {"Max Date", each Text.Combine(_[Date], ",")}),
#"Reordered Columns" = Table.ReorderColumns(
Custom3,
{"Month Name", "Min", "Min Date", "Max", "Max Date"}
)
in
#"Reordered Columns"
Solving the challenge of Find Monthly Min Max Dates with Excel
Excel solution 1 for Find Monthly Min Max Dates, proposed by Rick Rothstein:
=TEXTSPLIT(TEXTJOIN("*",,MAP(SEQUENCE(12),LAMBDA(x,LET(tj,LAMBDA(z,TEXTJOIN(", ",,TEXT(z,"yyyy-mm-dd"))),f,FILTER(A2:B366,MONTH(A2:A366)=x),t,TAKE(f,,1),n,DROP(f,,1),s,MIN(n),b,MAX(n),ds,FILTER(t,n=s),db,FILTER(t,n=b),TEXT(28*x,"mmm")&"|"&s&"|"&tj(ds)&"|"&b&"|"&tj(db))))),"|","*")
Excel solution 2 for Find Monthly Min Max Dates, proposed by محمد حلمي:
=LET(n,SEQUENCE(13,,0),z,SEQUENCE(,5),
MAP(n*z^0,z*IF(n,n^0,DROP(n,1)),LAMBDA(r,y,LET(
w,A2:A366,i,MONTH(w)=r,
e,FILTER(B2:B366,i),
p,LAMBDA(q,HSTACK(q,ARRAYTOTEXT(TEXT(
FILTER(FILTER(w,i),q=e),"yyyy-mm-dd")))),
INDEX(IFERROR(HSTACK(TEXT(r*29,"mmm"),
p(MIN(e)),p(MAX(e))),
{"Month","Min","Min Date","Max","Max Date"}),,y)))))
Excel solution 3 for Find Monthly Min Max Dates, proposed by محمد حلمي:
=VSTACK(
{"Month","Min","Min Date","Max","Max Date"},
MAKEARRAY(12,5,LAMBDA(r,c,INDEX(LET(
w,A2:A366,i,MONTH(w)=r,
e,FILTER(B2:B366,i),
p,LAMBDA(q,HSTACK(q,
ARRAYTOTEXT(TEXT(
FILTER(FILTER(w,i),q=e),"yyyy-mm-dd")))),
HSTACK(TEXT(r*29,"mmm"),p(MIN(e)),p(MAX(e)))),c))))
Excel solution 4 for Find Monthly Min Max Dates, proposed by محمد حلمي:
=REDUCE({"Month","Min","Min Date","Max","Max Date"},
SEQUENCE(12),LAMBDA(a,d,LET(
r,A2:A366,
b,B2:B366,
u,MONTH(r)=d,
i,FILTER(b,u),
p,LAMBDA(q,HSTACK(q,ARRAYTOTEXT(TEXT(
FILTER(FILTER(r,u),q=i),"yyyy-mm-dd")))),
VSTACK(a,HSTACK(TEXT(d*29,"mmm"),
p(MIN(i)),p(MAX(i)))))))
Excel solution 5 for Find Monthly Min Max Dates, proposed by Kris Jaganah:
=REDUCE({"Month","Min","Min Date","Max","Max Date"},UNIQUE(MONTH(A2:A366)),LAMBDA(x,y,VSTACK(x,LET(o,A2:A366,p,B2:B366,q,MONTH(o),a,FILTER(p,q=y),b,MIN(a),c,MAX(a),HSTACK(TEXT(y*28,"mmm"),b,ARRAYTOTEXT(FILTER(TEXT(o,"yyyy-mm-dd"),(q=y)*(p=b))),c,ARRAYTOTEXT(FILTER(TEXT(o,"yyyy-mm-dd"),(q=y)*(p=c))))))))
Excel solution 6 for Find Monthly Min Max Dates, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
_dt, A2:A366,
_amt, B2:B366,
_sdt, EDATE(MIN(_dt), SEQUENCE(12, , 0)),
_edt, EOMONTH(_sdt, 0),
_mnth, TEXT(_sdt, "mmm"),
_min, MINIFS(_amt, _dt, ">=" & _sdt, _dt, "<=" & _edt),
_max, MAXIFS(_amt, _dt, ">=" & _sdt, _dt, "<=" & _edt),
_e, LAMBDA(x, y,
ARRAYTOTEXT(
TEXT(
FILTER(_dt, (_amt = y) * (MONTH(_dt) = MONTH(x))),
"yyyy-mm-dd"
)
)
),
_mindt, MAP(_sdt, _min, _e),
_maxdt, MAP(_sdt, _max, _e),
_r, HSTACK(_mnth, _min, _mindt, _max, _maxdt),
_r
)
Excel solution 7 for Find Monthly Min Max Dates, proposed by Oscar Mendez Roca Farell:
=LET(_d,A2:B366,_m,INDEX(_d,,1), HSTACK(UNIQUE(TEXT(_m,"mmm")), TEXTSPLIT(TEXTJOIN("/ ", , MAP(ROW(1:12), LAMBDA(a,LET(_f,FILTER(_d,MONTH(_m)=a),
_i,INDEX(_f,,2), _j,INDEX(_f,,1), fx, LAMBDA(x, LET(_g,AGGREGATE(x,4,_i,1),_g&"|"&ARRAYTOTEXT(TEXT(TOCOL(_j/(_i=_g),2),"yyy-mm-dd")))), fx(15)&"|"&fx(14))))),"|","/")))
Excel solution 8 for Find Monthly Min Max Dates, proposed by Sunny Baggu:
=MAKEARRAY(
12,
5,
LAMBDA(r, c,
INDEX(
LET(
_cond, MONTH(A2:A366) = r,
_date, TOCOL(IFS(_cond, A2:A366), 3),
_amt, TOCOL(IFS(_cond, B2:B366), 3),
_min, MIN(_amt),
_mindate, ARRAYTOTEXT(TEXT(TOCOL(IFS(_amt = _min, _date), 3), "yyyy-mm-dd")),
_max, MAX(_amt),
_maxdate, ARRAYTOTEXT(TEXT(TOCOL(IFS(_amt = _max, _date), 3), "yyyy-mm-dd")),
HSTACK(TEXT(DATE(2023, r, 1), "mmm"), _min, _mindate, _max, _maxdate)
),
c
)
)
)
Excel solution 9 for Find Monthly Min Max Dates, proposed by Sunny Baggu:
=REDUCE(
{"Month", "Min", "Min Date", "Max", "Max Date"},
SEQUENCE(12),
LAMBDA(a, v,
VSTACK(
a,
LET(
_cond, MONTH(A2:A366) = v,
_date, TOCOL(IFS(_cond, A2:A366), 3),
_amt, TOCOL(IFS(_cond, B2:B366), 3),
_min, MIN(_amt),
_mindate, ARRAYTOTEXT(TEXT(TOCOL(IFS(_amt = _min, _date), 3), "yyyy-mm-dd")),
_max, MAX(_amt),
_maxdate, ARRAYTOTEXT(TEXT(TOCOL(IFS(_amt = _max, _date), 3), "yyyy-mm-dd")),
HSTACK(TEXT(DATE(2023, v, 1), "mmm"), _min, _mindate, _max, _maxdate)
)
)
)
)
Excel solution 10 for Find Monthly Min Max Dates, proposed by LEONARD OCHEA 🇷🇴:
=LET(d,A2:A366, a,B2:B366, m,UNIQUE(MONTH(d)), w,IF(m=TOROW(MONTH(d)),TOROW(a),""), h,BYROW(w,LAMBDA(x,MAX(x))), l,BYROW(w,LAMBDA(x,MIN(x))), f,LAMBDA(i,BYROW(IF(w=i,TOROW(d),""),LAMBDA(y,TEXTJOIN(", ",1,TEXT(y,"yyyy-mm-dd"))))), VSTACK(HSTACK("Month","Min","Min Date","Max","Max Date"),HSTACK(TEXT("1-"&m,"mmm"),l,f(l),h,f(h))) )
Excel solution 11 for Find Monthly Min Max Dates, proposed by JvdV -:
=DROP(REDUCE(0,ROW(1:12),LAMBDA(x,y,LET(z,FILTER(A2:B366,MONTH(A2:A366)=y),a,TEXT(TAKE(z,,1),"yyyy-mm-dd"),b,DROP(z,,1),VSTACK(x,HSTACK(TEXT(y*30,"mmm"),MIN(b),TEXTJOIN(", ",,REPT(a,b=MIN(b))),MAX(b),TEXTJOIN(", ",,REPT(a,b=MAX(b)))))))),1)
Excel solution 12 for Find Monthly Min Max Dates, proposed by Oscar Javier Rosero Jiménez:
=LET(
_date,A2:A366,
_Val,B2:B366,
_Mes,UNIQUE(TEXT(_date,"mmm")),
_min,MAP(_Mes,LAMBDA(f,MIN(FILTER(_Val,TEXT(_date,"mmm")=f)))),
_minfech, MAP(_Mes,_min,
LAMBDA(_f1,_f2,
TEXTJOIN(", ",,FILTER(TEXT(_date,"yyyy-mm-dd"), (TEXT(_date,"mmm")=_f1) * (_Val=_f2))))),
_Max, MAP(_Mes,LAMBDA(f,MAX(FILTER(_Val,TEXT(_date,"mmm")=f)))),
_MaxDate, MAP(_Mes,_Max,
LAMBDA(_f1,_f2,
TEXTJOIN(", ",,FILTER(TEXT(_date,"yyyy-mm-dd"), (TEXT(_date,"mmm")=_f1) * (_Val=_f2))))),
VSTACK(
HSTACK("Month","min","Min Date","Max","Max Date"),
HSTACK(_Mes,_min,_minfech,_Max,_MaxDate)))
Excel solution 13 for Find Monthly Min Max Dates, proposed by Md Ismail Hosen:
=LAMBDA(Date,
LET(
_MonthNameAll, TEXT(TAKE(Date, , 1), "mmm"),
_OneMonthCalculation, LAMBDA(MonthName,
LET(
FilteredData, FILTER(Date, _MonthNameAll = MonthName),
Dates, CHOOSECOLS(FilteredData, 1),
Amounts, CHOOSECOLS(FilteredData, 2),
MinValue, MIN(Amounts),
MaxValue, MAX(Amounts),
DateJoiner, LAMBDA(AllDate, TEXTJOIN(", ", TRUE, MAP(AllDate, LAMBDA(Curr, TEXT(Curr, "yyyy-mm-dd"))))),
MinValueDates, DateJoiner(FILTER(Dates, Amounts = MinValue)),
MaxValueDates, DateJoiner(FILTER(Dates, Amounts = MaxValue)),
Result, HSTACK(MonthName, MinValue, MinValueDates, MaxValue, MaxValueDates),
Result
)
),
_MonthName, UNIQUE(_MonthNameAll),
_Result, DROP(REDUCE("", _MonthName, LAMBDA(Acc, Curr, VSTACK(Acc, _OneMonthCalculation(Curr)))), 1),
_Result
)
)(Sheet1!A2:B366)
&&&
