Home » Generate Sequential Ticket Numbers

Generate Sequential Ticket Numbers

Create the ticket numbers for each State. For a state, ticket number will start with 1 and will run sequentially and will be 6 digits long and will be preceded by first 2 alphabets of state name. The numbers will be a range Start – End. Ex. for state California, 2 cities have been issued 10 and 12 tickets. So first city will have tickets from 1 to 10 and second will have tickets from 11 to 22. Hence numbers will be CA000001 – CA000010 and CA000011 – CA000022.

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 620
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Generate Sequential Ticket Numbers with Power Query

Power Query solution 1 for Generate Sequential Ticket Numbers, proposed by Kris Jaganah:
let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = Table.ToColumns(A), 
  C = List.Generate(
    () => [a = 0, b = B{0}{0}, c = B{2}{0}, d = 1], 
    each [a] < List.Count(B{0}), 
    each [
      a = [a] + 1, 
      b = if B{0}{a} = null then [b] else B{0}{a}, 
      c = if b = [b] then [c] + B{2}{a} else B{2}{a}, 
      d = if b = [b] then [c] + 1 else 1
    ], 
    each [
      p = List.Transform(
        {[c], [d]}, 
        (x) => Text.Upper(Text.Start([b], 2)) & Text.PadStart(Text.From(x), 6, "0")
      ), 
      q = p{1} & " - " & p{0}
    ][q]
  )
in
  Table.FromColumns({C}, {"Answer Expected"})
Power Query solution 2 for Generate Sequential Ticket Numbers, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Group = Table.Group(
    Source, 
    "State", 
    {
      "A", 
      each [
        FV = Text.Upper(Text.Start(Table.FirstValue(_), 2)), 
        G = List.Generate(
          () => [a = - 1, b = 0], 
          (f) => f[a] < Table.RowCount(_), 
          (f) => [
            a = f[a] + 1, 
            b = f[b] + _{a}[#"No. of Tickets"], 
            c = FV & Number.ToText(f[b] + 1, "000000 - ") & FV & Number.ToText(b, "000000")
          ], 
          (f) => f[c]
        ), 
        R = Table.FromColumns(
          Table.ToColumns(_) & {List.Skip(G)}, 
          Table.ColumnNames(_) & {"Answer"}
        )
      ][R]
    }, 
    0, 
    (x, y) => Number.From(y <> null)
  ), 
  Return = Table.Combine(Group[A])
in
  Return
Power Query solution 3 for Generate Sequential Ticket Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    "State", 
    {
      {
        "Answer", 
        each 
          let
            a = _, 
            b = Text.Upper(Text.Start([State]{0}, 2)), 
            c = List.Accumulate([No. of Tickets], {0}, (s, c) => s & {List.Last(s) + c}), 
            d = List.Transform(List.RemoveLastN(c), each _ + 1), 
            e = List.Skip(c), 
            f = List.Transform(
              {0 .. List.Count(d) - 1}, 
              each b
                & Text.PadStart(Text.From(d{_}), 6, "0")
                & " - "
                & b
                & Text.PadStart(Text.From(e{_}), 6, "0")
            )
          in
            f
      }
    }, 
    0, 
    (a, b) => Number.From(b <> null)
  )[[Answer]], 
  Sol = Table.ExpandListColumn(Group, "Answer")
in
  Sol
Power Query solution 4 for Generate Sequential Ticket Numbers, proposed by Abdallah Ally:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  f = (txt) => Text.Upper(Text.Start(txt, 2)), 
  g = (num) => Text.PadStart(Text.From(num), 6, "0"), 
  h = (tbl) => Table.ColumnNames(tbl), 
  Accum = List.Accumulate(
    {1 .. Table.RowCount(Source) - 1}, 
    {{f(Source[State]{0}), 1, Source[No. of Tickets]{0}}}, 
    (s, c) =>
      s
        & (
          if Source[State]{c} = null then
            [a = List.Last(s), b = {{a{0}, a{2} + 1, a{2} + Source[No. of Tickets]{c}}}][b]
          else
            {{f(Source[State]{c}), 1, Source[No. of Tickets]{c}}}
        )
  ), 
  Transform = List.Transform(Accum, each _{0} & g(_{1}) & " - " & _{0} & g(_{2})), 
  FromCols = Table.FromColumns(Table.ToColumns(Source) & {Transform}, h(Source) & {"My Answer"}), 
  Result = Table.AddColumn(FromCols, "Check", each [My Answer] = [Answer Expected])
in
  Result
Power Query solution 5 for Generate Sequential Ticket Numbers, proposed by Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  TAC = Table.AddColumn, 
  a = Table.FillDown(S, {"State"}), 
  b = Table.Group(a, "State", {"G", each _})[G], 
  Fx = (x) =>
    let
      c = Table.AddIndexColumn(x, "I", 1), 
      d = TAC(c, "R", each List.Sum(List.Range(c[No. of Tickets], 0, [I]))), 
      e = Table.AddIndexColumn(d, "J"), 
      f = TAC(e, "P", each try e{[J] - 1}[R] + 1 otherwise 1), 
      g = Table.TransformColumnTypes(f, {{"R", type text}, {"P", type text}}), 
      h = Table.TransformColumns(
        g, 
        {{"R", each Text.PadStart(_, 6, "0")}, {"P", each Text.PadStart(_, 6, "0")}}
      ), 
      i = TAC(
        h, 
        "Answer Expected", 
        each Text.Start(Text.Upper([State]), 2)
          & [P]
          & " - "
          & Text.Start(Text.Upper([State]), 2)
          & [R]
      )[[Answer Expected]]
    in
      i, 
  Sol = Table.Combine(List.Transform(b, each Fx(_)))
in
  Sol
Power Query solution 6 for Generate Sequential Ticket Numbers, proposed by Seokho MOON:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    "State", 
    {
      "Temp", 
      each List.Accumulate(
        List.Skip([No. of Tickets]), 
        {[S = 1, E = [No. of Tickets]{0}]}, 
        (a, v) => a & {[S = List.Last(a)[E] + 1, E = List.Last(a)[E] + v]}
      )
    }, 
    0, 
    (x, y) => Number.From(y <> null)
  ), 
  Expand = Table.ExpandRecordColumn(Table.ExpandListColumn(Group, "Temp"), "Temp", {"S", "E"}), 
  Res = Table.AddColumn(
    Expand, 
    "Answer Expected", 
    each [
      T = List.Transform(
        {[S], [E]}, 
        (x) => Text.Upper(Text.Start([State], 2)) & Number.ToText(x, "000000")
      ), 
      R = Text.Combine(T, " - ")
    ][R]
  )[[Answer Expected]]
in
  Res
Power Query solution 7 for Generate Sequential Ticket Numbers, proposed by Meganathan Elumalai:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  FillDown = Table.FillDown(Source, {"State"}), 
  Group = Table.Group(
    FillDown, 
    {"State"}, 
    {
      {
        "Ans", 
        each [
          lt = List.Transform, 
          ul = List.Skip(List.Accumulate(_[No. of Tickets], {0}, (s, c) => s & {List.Last(s) + c})), 
          ll = {1} & lt(List.RemoveLastN(ul, 1), (f) => f + 1), 
          zip = lt(
            List.Zip({ll, ul}), 
            (x) =>
              Text.Combine(
                lt(x, (z) => Text.Start(Text.Upper(_[State]{0}), 2) & Number.ToText(z, "000000")), 
                " - "
              )
          )
        ][zip]
      }
    }
  )[[Ans]], 
  Expand = Table.ExpandListColumn(Group, "Ans")
in
  Expand
Power Query solution 8 for Generate Sequential Ticket Numbers, proposed by Rafael González B.:
let
 Source = Question_Table,
 Fx_Sequence = (Tbl) =>
 let
 St = Text.Upper(Text.Start(Tbl{0}[State],2)),
 LV = Tbl[No. of Tickets],
 LS = List.Sum(LV),
 LP = List.Transform({1..LS}, each St & Text.PadStart(Text.From(_), Text.Length(Text.From(LS)), "0")),
 LG = List.Skip(List.Generate(
 () => [i = 0, L = LP],
 each [i] <= List.Count(LV),
 each [
 i = [i] + 1,
 LB = LV,
 LR = List.Range([L], 0, LB{i - 1}),
 L = List.RemoveFirstN([L], LB{i - 1}) 
 ],
 each [LR])),
 LT = List.Transform(LG, each List.First(_) & " - " & List.Last(_))
 in
 LT,
 Group = Table.FromList(
 List.Combine(
 Table.Group(Source, 
 "State", {{"Details", each Fx_Sequence(_)}}, 1, 
 (x,y) => Number.From(y is text))[Details]
 ), 
 null, {"Answer Expected"}
 )
in
 Group
🧙🏻‍♂️🧙🏻‍♂️🧙🏻‍♂️
                    
                  
          
Power Query solution 9 for Generate Sequential Ticket Numbers, proposed by CA Raghunath Gundi:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  FillDown = Table.FillDown(Source, {"State"}), 
  Code = Table.AddColumn(FillDown, "Code", each Text.Upper(Text.Start([State], 2)), type text), 
  Grp = Table.Group(
    Code, 
    {"State"}, 
    {{"Grp", each _, type table [State = text, City = text, No. of Tickets = number, Code = text]}}
  ), 
  FxA = (t) =>
    let
      Index = Table.AddIndexColumn(t, "Index", 0, 1, Int64.Type), 
      Start = Table.AddColumn(
        Index, 
        "start", 
        each [Code]
          & Text.PadStart(
            Text.From((List.Sum(List.FirstN(Index[No. of Tickets], [Index])) + 1) ?? 1), 
            6, 
            "0"
          )
      ), 
      End = Table.AddColumn(
        Start, 
        "end", 
        each [Code]
          & Text.PadStart(
            Text.From((List.Sum(List.FirstN(Index[No. of Tickets], [Index] + 1))) ?? 1), 
            6, 
            "0"
          )
      ), 
      Ans = Table.CombineColumns(
        End, 
        {"start", "end"}, 
        Combiner.CombineTextByDelimiter(" - ", QuoteStyle.None), 
        "Answer"
      )[Answer]
    in
      Ans, 
  Func = Table.ExpandListColumn(Table.TransformColumns(Grp, {"Grp", each FxA(_)}), "Grp")[[Grp]]
in
  Func
Power Query solution 10 for Generate Sequential Ticket Numbers, proposed by Mihai Radu O:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  prefF = (l as list) => List.Transform(l, (n) => Text.PadStart(Text.From(n), 6, "0")), 
  s = [
    lt = List.Transform, 
    lz = List.Zip, 
    nt = Source[No. of Tickets], 
    st = Source[State], 
    s = lt(st, (x) => Byte.From(x is null)), 
    a = List.Generate(
      () => [x = 0, y = nt{0}], 
      each [x] < List.Count(nt), 
      each [x = [x] + 1, y = [y] * s{x} + nt{x}], 
      each [y]
    ), 
    b = lt(lz({nt, a}), (x) => x{1} - x{0} + 1), 
    c = List.Generate(
      () => [x = 0, y = Text.Upper(Text.Start(st{0}, 2))], 
      each [x] < List.Count(st), 
      each [x = [x] + 1, y = if st{x} <> null then Text.Upper(Text.Start(st{x}, 2)) else [y]], 
      each [y]
    ), 
    d = lt(lz({c, prefF(b), prefF(a)}), (x) => x{0} & x{1} & " - " & x{0} & x{2})
  ][d]
in
  s
Power Query solution 11 for Generate Sequential Ticket Numbers, proposed by Krzysztof Kominiak:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Result = Table.Combine(
    Table.Group(
      Source, 
      {"State"}, 
      {
        {
          "NT", 
          each [
            a = _, 
            a1 = Text.Start(Text.Upper(_[State]{0}), 2), 
            b = a[No. of Tickets], 
            c = List.RemoveLastN(
              List.Accumulate(
                b, 
                {1}, 
                (s, c) => if List.IsEmpty(s) then {c} else s & {List.Last(s) + c}
              ), 
              1
            ), 
            d = List.Accumulate(
              b, 
              {}, 
              (s, c) => if List.IsEmpty(s) then {c} else s & {List.Last(s) + c}
            ), 
            e = List.Zip({c, d}), 
            f = List.Transform(
              e, 
              (x) =>
                a1
                  & Text.PadStart(Text.From(x{0}), 6, "0")
                  & " - "
                  & a1
                  & Text.PadStart(Text.From(x{1}), 6, "0")
            ), 
            g = Table.ToColumns(a) & {f}, 
            h = Table.FromColumns(g, Table.ColumnNames(a) & {"Answer"})
          ][h]
        }
      }, 
      0, 
      (x, y) => Number.From(y[State] <> null)
    )[NT]
  )
in
  Result

Solving the challenge of Generate Sequential Ticket Numbers with Excel

Excel solution 1 for Generate Sequential Ticket Numbers, proposed by Bo Rydobon 🇹🇭:
=SCAN(0,C2:C13,LAMBDA(a,v,LET(l,@+A13:v,TEXTJOIN(" - ",,UPPER(LEFT(l&a,2))&TEXT(IF(l>0,0,RIGHT(a,6))+v^{0,1},"000000")))))
Excel solution 2 for Generate Sequential Ticket Numbers, proposed by John V.:
=SCAN(0,
    C2:C13,
    LAMBDA(a,
    v,
    LET(i,
    @+A13:v,
    TEXTJOIN(" - ",
    ,
    UPPER(
        LEFT(
            IF(
                i>0,
                i,
                a
            ),
            2
        )
    )&TEXT((i=0)*RIGHT(
        a,
        6
    )+v^{0,
    1},
    "000000")))))
Excel solution 3 for Generate Sequential Ticket Numbers, proposed by Kris Jaganah:
=LET(
    p,
    SCAN(
        ,
        UPPER(
            LEFT(
                A2:A13,
                2
            )
        ),
        LAMBDA(
            x,
            y,
            IF(
                y="",
                x,
                y
            )
        )
    ),
    REDUCE(
        "Answer Expected",
        UNIQUE(
            p
        ),
        LAMBDA(
            v,
            w,
            VSTACK(
                v,
                LET(
                    a,
                    TEXT(
                        SCAN(
                            ,
                            FILTER(
                                C2:C13,
                                p=w
                            ),
                            SUM
                        ),
                        "000000"
                    ),
                    b,
                    TEXT(
                        VSTACK(
                            1,
                            DROP(
                                a,
                                -1
                            )+1
                        ),
                        "000000"
                    ),
                    w&b&" - "&w&a
                )
            )
        )
    )
)
Excel solution 4 for Generate Sequential Ticket Numbers, proposed by Julian Poeltl:
=DROP(REDUCE(0,UNIQUE(TOCOL(A2:A13,3)),LAMBDA(A,B,VSTACK(A,LET(L,UPPER(LEFT(B,2)),C,SCAN(0,FILTER(C2:C13,SCAN(0,A2:A13,LAMBDA(A,B,IF(B="",A,B)))=B),LAMBDA(A,B,A+B)),L&TEXT(DROP(VSTACK(1,C+1),-1),"000000")&" - "&L&TEXT(C,"000000"))))),1)
Excel solution 5 for Generate Sequential Ticket Numbers, proposed by Timothée BLIOT:
=LET(A,A2:A13,B,C2:C13,C,SEQUENCE(ROWS(A)),D,SCAN(0,A,LAMBDA(w,v,IF(v=0,w,UPPER(LEFT(v,2))))),E,SCAN(0,C,LAMBDA(w,v,IF(INDEX(A,v)=0,INDEX(B,v)+w,INDEX(B,v)))),MAP(C,LAMBDA(x,INDEX(D,x)&BASE(IF(INDEX(A,x)<>0,1,INDEX(E,x-1)+1),10,6)&" - "&INDEX(D,x)&BASE(INDEX(E,x),10,6))))
Excel solution 6 for Generate Sequential Ticket Numbers, proposed by Oscar Mendez Roca Farell:
=LET(
    d,
    A2:A13,
    s,
    SCAN(
        0,
        d,
        LAMBDA(
            i,
            x,
            LET(
                n,
                MAX(
                    TAKE(
                        x:C13,
                        1
                    )
                ),
                IF(
                    x>"",
                    n,
                    n+i
                )
            )
        )
    ),
    BYROW(
        SCAN(
            0,
            d,
            LAMBDA(
                i,
                x,
                IF(
                    x>"",
                    UPPER(
                        MID(
                            x,
                            1,
                            2
                        )
                    ),
                 &   i
                )
            )
        )&TEXT(
            HSTACK(
                VSTACK(
                    0,
                    DROP(
                        s,
                        -1
                    )
                )+1,
                s
            ),
            "000000"
        )&{" - ",
        ""},
        CONCAT
    )
)
Excel solution 7 for Generate Sequential Ticket Numbers, proposed by Sunny Baggu:
=LET(
 _f, SCAN("", A2:A13, LAMBDA(a, v, IF(v = "", a, v))),
 _u, UNIQUE(_f),
 DROP(
 REDUCE(
 "😊🆕year",
 _u,
 LAMBDA(x, y,
 VSTACK(
 x,
 LET(
 _t, FILTER(C2:C13, _f = y),
 _rt, SCAN(0, _t, LAMBDA(a, v, a + v)),
 BYROW(
 WRAPROWS(
 UPPER(LEFT(y, 2)) &
 VSTACK("000001", DROP(TOCOL(TEXT(HSTACK(_rt, _rt + 1), "000000")), -1)),
 2
 ),
 LAMBDA(a, TEXTJOIN(" - ", , a))
 )
 )
 )
 )
 ),
 1
 )
)
Excel solution 8 for Generate Sequential Ticket Numbers, proposed by LEONARD OCHEA 🇷🇴:
=LET(n,
    C2:C13,
    i,
    UPPER(
        LEFT(
            SCAN(
                ,
                A2:A13,
                LAMBDA(
                    a,
                    b,
                    IF(
                        b>0,
                        b,
                        a
                    )
                )
            ),
            2
        )
    ),
    s,
    SEQUENCE(
        ROWS(
            n
        )
    ),
    z,
    s-TOROW(
        s
    ),
    F,
    LAMBDA([x],
    MMULT((i=TOROW(
        i
    ))*(IF(
        x,
        z>=0,
        z>0
    )),
    n)),
    G,
    LAMBDA(
        x,
        i&TEXT(
            x,
            "000000"
        )
    ),
    G(
        F()+1
    )&" - "&G(
        F(
            1
        )
    ))
Excel solution 9 for Generate Sequential Ticket Numbers, proposed by Md. Zohurul Islam:
=LET(
    a,
    A2:A13,
    b,
    C2:C13,
    d,
    LEFT(
        UPPER(
            SCAN(
                ,
                a,
                LAMBDA(
                    x,
                    y,
                    IF(
                        y="",
                        x,
                        y
                    )
                )
            )
        ),
        2
    ),
    unq,
    UNIQUE(
        d
    ),
    e,
    DROP(
        REDUCE(
            "",
            unq,
            LAMBDA(
                x,
                y,
                LET(
                    p,
                    FILTER(
                        b,
                        d=y
                    ),
                    q,
                    SCAN(
                        ,
                        p,
                        SUM
                    ),
                    s,
                    TEXT(
                        q,
                        "000000"
                    ),
                    u,
                    TEXT(
                        VSTACK(
                            1,
                            DROP(
                                q,
                                -1
                            )+1
                        ),
                        "000000"
                    ),
                    v,
                    y&u&" - "&y&s,
                    w,
                    VSTACK(
                        x,
                        v
                    ),
                    w
                )
            )
        ),
        1
    ),
    e
)
Excel solution 10 for Generate Sequential Ticket Numbers, proposed by Asheesh Pahwa:
=LET(
    s,
    SCAN(
        "",
        A2:A13,
        LAMBDA(
            x,
            y,
            IF(
                y<>"",
                y,
                x
            )
        )
    ),
    u,
    UNIQUE(
        s
    ),
    REDUCE(
        C1,
        u,
        LAMBDA(
            a,
            v,
            VSTACK(
                a,
                LET(
                    f,
                    FILTER(
                        C2:C13,
                        s=v
                    ),
                    _s,
                    SCAN(
                        0,
                        f,
                        LAMBDA(
                            x,
                            y,
                            x+y
                        )
                    ),
                    l,
                    UPPER(
                        LEFT(
                            v,
                            2
                        )
                    ),
                    t,
                    TEXT(
                        _s,
                        "000000"
                    ),
                    b,
                    TEXT(
                        VSTACK(
                            1,
                            DROP(
                                t,
                                -1
                            )+1
                        ),
                        "000000"
                    ),
                    l&b&" - "&l&t
                )
            )
        )
    )
)
Excel solution 11 for Generate Sequential Ticket Numbers, proposed by Philippe Brillault:
=LET(PUSH,LAMBDA(x,y,DROP(VSTACK(y,x),-1)),FT,LAMBDA(x,TEXT(x,"000000")),partcum,LAMBDA(x,y,IF(y=0,0,x+y)),fill,LAMBDA(x,y,IF(y="",x,y)),tk,_T[No.ofTickets],st,_T[State],start,SCAN(,(st="")*PUSH(tk,0),partcum)+1,end,start+tk-1,state,UPPER(LEFT(SCAN(,st,fill),2)),state&FT(start)&"-"&state&end)
Excel solution 12 for Generate Sequential Ticket Numbers, proposed by Ricardo Romero Garcia:
=LET(
    i;
    TEXTO(
        SCAN(
            0;
            C2:C13;
            LAMBDA(
                a;
                v;
                SI(
                    DESREF(
                        v;
                        ;
                        -2;
                        
                    )>0;
                    1;
                    a+DESREF(
                        v;
                        -1;
                        0
                    )
                )
            )
        );
        "000000"
    );
    
     f;
    SCAN(
        0;
        C2:C13;
        LAMBDA(
            a;
            v;
            TEXTO(
                SI(
                    DESREF(
                        v;
                        ;
                        -2;
                        
                    )>0;
                    v;
                    a+v
                );
                "000000"
            )
        )
    );
    
     s;
    MAYUSC(
        IZQUIERDA(
            SCAN(
                "";
                A2:A13;
                LAMBDA(
                    a;
                    v;
                    SI(
                        v="";
                        a;
                        v
                    )
                )
            );
            2
        )
    );
    
     s&i&" - "&s&f
)
Excel solution 13 for Generate Sequential Ticket Numbers, proposed by Craig Hatmaker:
=TicketRange(DROP(A:.A,1), DROP(C:.C,1))

TicketRange = LAMBDA( States, Tickets,
 LET( 
 State,      UPPER( LEFT( SCAN( "", States, 
 LAMBDA(Acc, Val, IF( Val=0, Acc, Val))), 2)),
 TicketEnd,  SCAN(0, SEQUENCE( ROWS( States)), 
 LAMBDA(Acc, n, 
 IF( INDEX( States, n) = 0, 
 Acc + INDEX( Tickets, n), 
 INDEX( Tickets, n)))),
 TicketBeg,  TicketEnd - Tickets + 1,
 Result,     State & TEXT(TicketBeg,"000000") & " - " & 
 State & TEXT(TicketEnd,"000000"),
 Result
 )
)
Excel solution 14 for Generate Sequential Ticket Numbers, proposed by Scott Miller:
=LET(
Prefix,
    IF(
        A2="",
        LEFT(
            I1,
            2
        ),
        LEFT(
            A2,
            2
        )
    ),
    
Qty,
    C2,
    
Start,
    IF(
        OR(
            A1="State",
            A2<>""
        ),
        1,
        RIGHT(
            TEXTAFTER(
                I1,
                " - "
            ),
            6
        )+1
    ),
    
Prefix&TEXT(
    Start,
    "000000"
)&" - "&Prefix&TEXT((Start+Qty-1),
    "000000"))

Solving the challenge of Generate Sequential Ticket Numbers with Python

Python solution 1 for Generate Sequential Ticket Numbers, proposed by Konrad Gryczan, PhD:
import pandas as pd
path = "620 Ticket Numbers.xlsx"
input = pd.read_excel(path, sheet_name=0, usecols="A:C", nrows=13)
test = pd.read_excel(path, sheet_name=0, usecols="D", nrows=13)
input['State'] = input['State'].ffill()
input['abbr'] = input['State'].str[:2].str.upper()
input['cum_num'] = input['No. of Tickets'].cumsum()
input['max_cums'] = input['cum_num'].max()
input['first_per_city'] = (input['cum_num'] - input['No. of Tickets'] + 1).astype(str).str.zfill(6)
input['max_per_city'] = input['cum_num'].astype(str).str.zfill(6)
input['Answer Expected'] = input.apply(lambda row: f"{row['abbr']}{row['first_per_city']} - {row['abbr']}{row['max_per_city']}", axis=1)
result = input[['Answer Expected']]
print(result.equals(result)) # True
                    
                  

Solving the challenge of Generate Sequential Ticket Numbers with Python in Excel

Python in Excel solution 1 for Generate Sequential Ticket Numbers, proposed by Alejandro Campos:
df = xl("A1:D13", headers=True).ffill()
def generate_ticket_numbers(df):
 return pd.DataFrame([{
 "Ticket Range": f"{state[:2].upper()}{start:06d}-{state[:2].upper()}{start + count - 1:06d}"}
 for state in df['State'].unique()
 for start, count in zip(
 [1] + list(df[df['State'] == state]['No. of Tickets'].cumsum()[:-1] + 1),
 df[df['State'] == state]['No. of Tickets'])])
ticket_df = generate_ticket_numbers(df)
                    
                  

Solving the challenge of Generate Sequential Ticket Numbers with R

R solution 1 for Generate Sequential Ticket Numbers, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/620 Ticket Numbers.xlsx"
input = read_excel(path, range = "A1:C13")
test  = read_excel(path, range = "D1:D13")
result = input %>%
 fill(State, .direction = "down") %>%
 mutate(abbr = str_to_upper(str_sub(State, 1, 2)), 
 cum_num = cumsum(`No. of Tickets`), 
 max_cums = max(cum_num),
 first_per_city = str_pad(as.character(cum_num - `No. of Tickets` + 1), 6, pad = "0", side = "left"),
 max_per_city = str_pad(as.character(cum_num), 6, pad = "0", side = "left"),
 .by = State) %>%
 mutate(`Answer Expected` = pmap_chr(list(first_per_city, max_per_city, abbr), ~paste0(..3, ..1, " - ",..3, ..2))) %>%
 select(`Answer Expected`)
all.equal(result, test, check.attributes = FALSE)
# [1] TRUE
                    
                  

&&

Leave a Reply