Insert header row after 1 name, then after 2 names, then after 3 names and so on.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 90
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Insert Increasing Header Intervals with Power Query
Power Query solution 1 for Insert Increasing Header Intervals, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Gen = Table.PromoteHeaders(
Table.FromRows(
List.Combine(
List.Generate(
() => [n = 1, s = Table.ToRows(Source), b = {}],
each List.Count([s]) > 0,
each [
n = [n] + 1,
s = List.Skip([s], [n] - 1),
b = {Table.ColumnNames(Source)} & List.FirstN(List.Skip([s], [n] - 1), [n])
],
each [b]
)
)
)
)
in
Gen
Power Query solution 2 for Insert Increasing Header Intervals, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Index = Table.FromColumns(
Table.ToColumns(Source)
& {
List.FirstN(
List.Accumulate({1 .. Table.RowCount(Source)}, {}, (s, l) => s & {1 .. l}),
Table.RowCount(Source)
)
},
Table.ColumnNames(Source) & {"A"}
),
Combine = Table.PromoteHeaders(
Table.Combine(
Table.Group(
Index,
"A",
{"T", each Table.DemoteHeaders(Table.RemoveColumns(_, "A"))},
0,
(b, e) => Number.From(e = 1)
)[T]
)
)
in
Combine
Power Query solution 3 for Insert Increasing Header Intervals, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
IsHeader = (row) =>
let
r = List.Generate(
() => [x = 1, y = 1],
each [y] <= row,
each [x = [x] + 1, y = [x] * ([x] + 1) / 2],
each [y]
)
in
List.Contains(r, row),
H = Table.ColumnNames(Source),
B = Table.ToRows(Source),
S = List.Accumulate(
List.Positions(B),
{},
(s, c) => s & {B{c}} & (if IsHeader(c + 1) then {H} else {})
)
in
Table.FromRows(S, H)
Power Query solution 4 for Insert Increasing Header Intervals, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
Header = Table.ColumnNames(Source),
Body = Table.ToRows(Source),
S = List.Combine(
List.Generate(
() => [c = 0, i = 1, t = 1],
each [c] < Table.RowCount(Source),
each [
c = [c] + 1,
i = (if [i] = [t] then 1 else [i] + 1),
t = (if [i] = [t] then [t] + 1 else [t])
],
each List.Split(Body{[c]} & (if [i] = [t] then Header else {}), 2)
)
)
in
Table.FromRows(S, Header)
Power Query solution 5 for Insert Increasing Header Intervals, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
Headers = Table.ColumnNames(Source),
NumList = List.Select(List.Generate(
()=> [x = 3, y = 1],
each [x] <= 18,
each [x = [x]+1, y = [y]+[x]],
each [y]), each _ < Table.RowCount(Source)+5),
InsList = List.Accumulate(NumList, Table.ToRows(Source), (s,c)=> List.InsertRange(s, c, {Headers})),
Sol = Table.FromRows(InsList, Table.ColumnNames(Source))
in
Sol
Show translation
Show translation of this comment
Power Query solution 6 for Insert Increasing Header Intervals, proposed by Eric Laforce:
let
Source = Excel.CurrentWorkbook(){[Name = "tData90"]}[Content],
CN = Table.ColumnNames(Source),
Transform = List.Accumulate(
Table.ToRows(Source),
[r = {}, i = 0, n = 1],
(s, c) =>
let
_CheckNewSerie = Number.From((s[i] + 1) = s[n]),
_NewCN = if (_CheckNewSerie = 1) then {CN} else {}
in
[i = (s[i] + 1) * (1 - _CheckNewSerie), n = s[n] + _CheckNewSerie, r = s[r] & {c} & _NewCN]
),
ToTable = Table.FromRows(Transform[r], CN)
in
ToTable
Solving the challenge of Insert Increasing Header Intervals with Excel
Excel solution 1 for Insert Increasing Header Intervals, proposed by Bo Rydobon 🇹🇭:
=LET(R,LAMBDA(R,a,n,b,IF(ISTEXT(@+a),R(R,DROP(a,n),n+1,VSTACK(b,A1:B1,TAKE(a,n))),DROP(b,1))),R(R,A2:B19,1,0))
Excel solution 2 for Insert Increasing Header Intervals, proposed by Rick Rothstein:
=LET(a,A1:A19,b,B1:B19,s,SEQUENCE(COUNTA(a)),TEXTSPLIT(REDUCE(TEXTJOIN("/",,a&"-"&b),(s+1)*(s+2)/2,LAMBDA(a,x,SUBSTITUTE(a,"/","/FirstName-LastName/",x-1))),"-","/"))
Excel solution 3 for Insert Increasing Header Intervals, proposed by محمد حلمي:
=LET(r,A1:B19,s,ROW(r),CHOOSEROWS(r,TOCOL(HSTACK(s,XMATCH(s,s*(s+1)/2+1)^0),2)))
Excel solution 4 for Insert Increasing Header Intervals, proposed by محمد حلمي:
=LET(r,A1:B19,s,ROW(r),CHOOSEROWS(r,TOCOL(HSTACK(s,XMATCH(s,SCAN(1,s,LAMBDA(a,d,a+d)))^0),2)))
Excel solution 5 for Insert Increasing Header Intervals, proposed by محمد حلمي:
=LET(r,A1:B19,s,ROW(r),CHOOSEROWS(r,TOCOL(HSTACK(s,
XMATCH(s,SCAN(1,ROW(1:99),LAMBDA(a,d,a+d)))^0),2)))
Excel solution 6 for Insert Increasing Header Intervals, proposed by محمد حلمي:
=LET(r,A1:B19,s,ROW(r),CHOOSEROWS(r,TOCOL(HSTACK(s,
XMATCH(s,SCAN(1,SEQUENCE(99),LAMBDA(a,d,a+d)))^0),2)))
Excel solution 7 for Insert Increasing Header Intervals, proposed by محمد حلمي:
=LET(r,A1:B19,s,SEQUENCE(ROWS(r)),CHOOSEROWS(r, TOCOL(HSTACK(s,XMATCH(s,SCAN(1,SEQUENCE(99),LAMBDA(a,d,a+d)))^0),2)))
Excel solution 8 for Insert Increasing Header Intervals, proposed by محمد حلمي:
=LET(e,A2:B19,n,ROWS(e),r,SEQUENCE(n),
v,TAKE(TEXTSPLIT(CONCAT(REPT(r&" ",r)&" "),," ",1),n),
DROP(REDUCE(0,UNIQUE(v),LAMBDA(a,d,VSTACK(a,
VSTACK(A1:B1,FILTER(e,v=d))))),1))
Excel solution 9 for Insert Increasing Header Intervals, proposed by Kris Jaganah:
=LET(a,A2:A19,b,B2:B19,c,SEQUENCE(ROWS(a)),d,c*(c+1)/2,e,XLOOKUP(c,d,d),f,HSTACK(a&"-"&b,IF(e>0,"FirstName-LastName","")),VSTACK({"FirstName","LastName"},TEXTSPLIT(ARRAYTOTEXT(TOCOL(f,3)),"-",", ")))
Excel solution 10 for Insert Increasing Header Intervals, proposed by Oscar Mendez Roca Farell:
=LET(_d, A3:B20,_f, ROW(_d),_g, ROWS(_d),_m, VSTACK(1, MMULT(--(_f>=TOROW(_f)),_f-1)+1),_e, A2:B2, REDUCE(_e, SEQUENCE(MATCHX(_g,_m, 1)), LAMBDA(i, x, LET(_t, TAKE(_d, MIN(_g,INDEX(_m, x))), VSTACK(i, IF(x-1, VSTACK(_e, DROP(_t, MAX(INDEX(_m, x-1)))), INDEX(_d, 1, )))))))
Excel solution 11 for Insert Increasing Header Intervals, proposed by Sunny Baggu:
=LET(
_s, SEQUENCE(ROWS(A2:A19)),
_rt, DROP(VSTACK(1, SCAN(1, _s, LAMBDA(a, v, a + v))), -1),
_max, MAX(_s),
_res, DROP(
REDUCE(
"",
_s,
LAMBDA(a, v,
VSTACK(
a,
LET(
_i, INDEX(_rt, v, 1),
_j, INDEX(_s, v, 1),
IF(
_i <= _max,
VSTACK(
A1:B1,
CHOOSEROWS(
A2:B19,
TOCOL(
SEQUENCE(
,
IF(_j + _i <= _max, _j, _max - _i + 1),
_i
),
3
)
)
),
""
)
)
)
)
),
1
),
FILTER(_res, CHOOSECOLS(_res, 1) <> "")
)
Excel solution 12 for Insert Increasing Header Intervals, proposed by LEONARD OCHEA 🇷🇴:
=LET(h,A1:B1,d,A2:B19,r,ROWS(d),n,ROUNDUP(((8*r+1)^0.5-1)/2,0),DROP(REDUCE(h,SEQUENCE(n),LAMBDA(a,b,VSTACK(a,INDEX(d,SEQUENCE(b,,(b^2-b+2)/2),SEQUENCE(,2)),h))),r-(n^2+n+2)/2))
Excel solution 13 for Insert Increasing Header Intervals, proposed by Ziad A.:
=INDEX(LET(d,A:B,r,ROW(d),c,COUNTIF(r/2*(r+1),r),IF(r>COUNTA(d)/1.6,,IF(c,A1:B1,VLOOKUP(COUNTIFS(c,c,r,"<="&r),{r-1,d},{2,3},)))))
Excel solution 14 for Insert Increasing Header Intervals, proposed by Quadri Olayinka Atharu:
=LET(h,A1:B1,_d,A2:B19,_rn,ROWS(_d),
_rc,SEQUENCE(ROUNDUP(SQRT(_rn),0)),
_ad,(_rc*(_rc+1)/2)+0.1,
_n,VSTACK(SEQUENCE(_rn),_ad),
_t,DROP(SORT(HSTACK(_n,_d),1),,1),
_s,IFNA(_t,h),
r,IF(SUM(N(TAKE(_s,-1)=h))=2,DROP(_s,-1),_s),
VSTACK(h,r))
Excel solution 15 for Insert Increasing Header Intervals, proposed by Quadri Olayinka Atharu:
=LET(h,A1:B1,_d,A2:B19,_rn,ROWS(_d),
_rc,SEQUENCE(ROUNDUP(SQRT(_rn),0)),_ad,(_rc*(_rc+1)/2)+0.1,
_n,VSTACK(SEQUENCE(_rn),_ad),
_t,IFNA(DROP(HSTACK(_n,_d),,1),h),
r,VSTACK(h,SORTBY(_t,_n)),
r)
&&&
