Generate Result table on the basis of problem tables. You need to populate Start headers from second table into first table.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 89
Challenge Difficulty: ⭐️⭐️⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Populate Headers from Lookup Table with Power Query
Power Query solution 1 for Populate Headers from Lookup Table, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content],
Unpivot =
let
l = Table.ToColumns(Table.RemoveLastN(Table.UnpivotOtherColumns(Source, {}, "S", "T")))
in
Table.Buffer(
Table.FromColumns(l & {List.Skip(l{1}) & {1}}, {"Start", "Start Time", "End Time"})
),
T1 = Table.RenameColumns(
Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
{{"Start Time", "S"}, {"End Time", "E"}}
),
Sel = Table.AddColumn(
T1,
"T",
each Table.TransformColumns(
Table.SelectRows(
Unpivot,
(u) =>
u[Start Time]
< Number.Mod(Number.From([E]), 1) and u[End Time]
> Number.Mod(Number.From([S]), 1)
),
{
{
"Start Time",
(t) =>
let
a = Number.From([S]),
b = t + Number.IntegerDivide(a, 1)
in
if a > b then a else b
},
{
"End Time",
(t) =>
let
a = Number.From([E]),
b = t + Number.IntegerDivide(a, 1)
in
if a > b then b else a
}
}
)
),
Expand = Table.SelectColumns(
Table.ExpandTableColumn(Sel, "T", {"Start", "Start Time", "End Time"}),
{"Fleet", "Start Time", "End Time", "Group", "Start"}
)
in
Expand
Power Query solution 2 for Populate Headers from Lookup Table, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
UnPiv = Table.UnpivotOtherColumns(
Excel.CurrentWorkbook(){[Name = "Table2"]}[Content],
{},
"Start",
"From"
),
Int = Table.RemoveLastN(
Table.AddColumn(
UnPiv,
"To",
each
let
l = List.RemoveLastN(UnPiv[From]) & {1}
in
l{List.PositionOf(l, [From]) + 1}
)
),
AddInt = Table.ExpandTableColumn(
Table.AddColumn(
Source,
"T2",
each
let
st = Number.From(DateTime.Time([Start Time])),
et = Number.From(DateTime.Time([End Time])),
s = 1 / (24 * 60)
in
Table.SelectRows(
Int,
each (st >= [From] and st <= [To] - s)
or (et - s >= [From] and et - s <= [To])
or ([From] >= st and [To] <= et)
)
),
"T2",
{"Start", "From", "To"}
),
S = Table.RemoveColumns(
Table.ReplaceValue(
Table.ReplaceValue(
AddInt,
each [Start Time],
each
let
dt = Number.From([Start Time]),
d = Number.RoundDown(dt),
t = Number.Mod(dt, 1)
in
DateTime.From(d + (if t > [From] then t else [From])),
Replacer.ReplaceValue,
{"Start Time"}
),
each [End Time],
each
let
dt = Number.From([End Time]),
d = Number.RoundDown(dt),
t = Number.Mod(dt, 1)
in
DateTime.From(d + (if t > [To] then [To] else t)),
Replacer.ReplaceValue,
{"End Time"}
),
{"From", "To"}
)
in
S
Power Query solution 3 for Populate Headers from Lookup Table, proposed by Eric Laforce:
let
STimes = let
_T = Excel.CurrentWorkbook(){[Name="tData89_Start"]}[Content],
_Transform = Table.RemoveLastN(Table.UnpivotOtherColumns(_T, {}, "Start", "Hour"))
in Table.Buffer(_Transform),
Source = Excel.CurrentWorkbook(){[Name="tData89"]}[Content],
MergeP = Table.CombineColumnsToRecord(Source, "Period", {"Start Time", "End Time"}),
Tranf_P = Table.TransformColumns(MergeP, {"Period", (r)=> let
_TS = r[Start Time], _TE = r[End Time],
_Hours = let
_L1 = List.Generate(()=>_TS, each _<_TE, each _+hashtag#duration(0,0,60-Time.Minute(_),0) )
in List.Skip(_L1) & {_TE},
_Periods = List.Accumulate(_Hours, [ts=_TS, i=-1, r={}], (s,c)=>let
_i = List.Count(List.Select(STimes[Hour], each Time.From(_)
Solving the challenge of Populate Headers from Lookup Table with Excel
Excel solution 1 for Populate Headers from Lookup Table, proposed by Bo Rydobon 🇹🇭:
=LET(z,A2:D8,w,A12:D14,y,DROP(TOCOL(w,3),-1),
REDUCE(HSTACK(A1:D1,"Start"),SEQUENCE(ROWS(z)),LAMBDA(a,n,LET(
b,INDEX(z,n,2),c,MOD(b,1),d,MOD(INDEX(z,n,3),1),i,INT(b),s,MATCH(c,y),t,SEQUENCE(MATCH(d,y)-s+1,,s),
e,INDEX(y,t),f,IFERROR(INDEX(y,t+1),1),VSTACK(a,HSTACK(IF(t,INDEX(z,n,1)),i+IF(c>e,c,e),i+IF(f>d,d,f),IF(t,INDEX(z,n,4)),INDEX(TOCOL(IFNA(A11:D11,w)),t)))))))
Excel solution 2 for Populate Headers from Lookup Table, proposed by محمد حلمي:
=REDUCE(HSTACK(A1:D1,"Start"),B2:B8,LAMBDA(a,d,LET(
h,OFFSET(d,,1),r,TOCOL(A12:D14),c,MOD(d,1),u,TAKE(d-c,)+FILTER(r,(r>c)*(MOD(OFFSET(d,,1),1)>r)),e,TOCOL(
VSTACK(1,u),2),y,TOCOL(VSTACK(d,u),2),VSTACK(a,HSTACK(IF(e,OFFSET(d,,-1)),y,TOCOL(VSTACK(u,h),2),IF(e,OFFSET(d,,2)),XLOOKUP(ROUND(MOD(y,1),9),ROUND(r,9),TAKE(TOCOL(IFNA(A11:D11,r)),ROWS(r)),,-1))))))
Excel solution 3 for Populate Headers from Lookup Table, proposed by محمد حلمي:
=REDUCE(HSTACK(A1:D1,"Start"),SEQUENCE(ROWS(A2:D8)),LAMBDA(a,d,LET(x,A2:D8,v,INDEX(x,d,2),h,INDEX(x,
d,3),r,TOCOL(A12:D14),c,MOD(v,1),u,TAKE(v-c,)+FILTER(
r,(r>c)*(MOD(h,1)>r)),e,TOCOL(VSTACK(1,u),2),y,
TOCOL(VSTACK(v,u),2),VSTACK(a,HSTACK(IF(e,INDEX(x,
d,1)),y,TOCOL(VSTACK(u,h),2),IF(e,INDEX(x,d,4)),
XLOOKUP(ROUND(MOD(y,1),9),ROUND(r,9),TAKE(
TOCOL(IFNA(A11:D11,r)),ROWS(r)),,-1))))))
Excel solution 4 for Populate Headers from Lookup Table, proposed by Oscar Mendez Roca Farell:
=LET(_m, A2:D8, REDUCE(HSTACK(A1:D1, "Star"), ROW(_m)-1, LAMBDA(i, x, LET(_t,A12:D14,_b,A11:D11,st, MOD(INDEX(_m, x, 2), 1), et, MOD(INDEX(_m, x, 3), 1),_e, REPT(_t, 1/(st<_t)/(et>_t)/(_t<>"")),_i, VSTACK(INDEX(_m, x, 2), INT(INDEX(_m, x, 2)/1)+TOCOL(_e, 3)),_f, VSTACK(DROP(_i, 1), INDEX(_m, x, 3)),_c, TAKE(TOCOL(REPT(_b, 1/(ABS(_t-st)=MIN(ABS(_t-st)))), 3), 1),_r, VSTACK(_c, TOCOL(REPT(_b, _e>0), 3)), VSTACK(i, IFERROR(HSTACK(IF(_i, INDEX(_m, x, 1)),_i,_f,IF(_i, INDEX(_m, x, 4)),_r), HSTACK(INDEX(_m, x, ),_c)))))))
&&&
