Home » Insert Increasing Header Intervals

Insert Increasing Header Intervals

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)

&&&

Leave a Reply