Home » Extract Top Number Groups

Extract Top Number Groups

Extract the group of numbers from A2:A11 and list the top 3 unique maximum and minimum numbers. For example – A5A36449EYU9C577AAAQ – This has following groups of numbers 5, 36449, 9, 577

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

Solving the challenge of Extract Top Number Groups with Power Query

Power Query solution 1 for Extract Top Number Groups, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Rs = 
    let
      a = List.Sort(
        List.Distinct(
          List.RemoveNulls(
            List.Transform(
              Text.SplitAny(Text.Combine(Source[String], "A"), Text.Combine({"A" .. "Z"})), 
              Number.From
            )
          )
        )
      )
    in
      Table.FromColumns(
        {List.Reverse(List.LastN(a, 3)), List.FirstN(a, 3)}, 
        {"Top 3 Max", "Top 3 Min"}
      )
in
  Rs
Power Query solution 2 for Extract Top Number Groups, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Transform = List.Distinct(
    List.RemoveNulls(
      List.Transform(
        List.Combine(
          List.Transform(Source[String], (f) => Text.SplitAny(f, Text.Combine({"A" .. "Z"})))
        ), 
        Number.From
      )
    )
  ), 
  Result = Table.FromColumns({List.MaxN(Transform, 3)} & {List.MinN(Transform, 3)}, {"Max", "Min"})
in
  Result
Power Query solution 3 for Extract Top Number Groups, proposed by Alejandro Simón 🇵🇦 🇪🇸:
Acabo de revisar la ventaja de utilizar la función Text.Split,Any, simplemente brillante, sencilla y elegante!!! 🤐 
                    
                      
  
                  
    
      
        Show translation
      
      
Power Query solution 4 for Extract Top Number Groups, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Custom1 = Table.AddColumn(
    Source, 
    "New", 
    each List.Transform(
      List.Select(
        Text.Split(
          Text.Combine(
            List.ReplaceMatchingItems(
              Text.ToList([String]), 
              List.Zip({{"A" .. "Z"}, List.Repeat({","}, List.Count({"A" .. "Z"}))})
            ), 
            ""
          ), 
          ","
        ), 
        each _ <> ""
      ), 
      each Number.From(_)
    )
  ), 
  Custom2 = Table.FromColumns(
    {
      List.FirstN(List.Reverse(List.Distinct(List.Sort(List.Combine(Custom1[New])))), 3), 
      List.FirstN(List.Distinct(List.Sort(List.Combine(Custom1[New]))), 3)
    }, 
    {"Top 3 Max", "Top 3 Min"}
  )
in
  Custom2
Power Query solution 5 for Extract Top Number Groups, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  tab = Table.AddColumn(
    Fonte, 
    "Personalizar", 
    each Splitter.SplitTextByAnyDelimiter({"A" .. "Z"}, QuoteStyle.Csv)([String])
  ), 
  Result = Table.FromColumns(
    [
      a = List.Select(Table.ExpandListColumn(tab, "Personalizar")[Personalizar], each _ <> ""), 
      b = List.Distinct(List.Sort(List.Transform(a, Number.From))), 
      c = List.FirstN(b, 3), 
      d = List.Sort(List.LastN(b, 3), Order.Descending), 
      e = {d, c}
    ][e], 
    {"Top 3 Max", "Top 3 Min"}
  )
in
  Result
Power Query solution 6 for Extract Top Number Groups, proposed by Bhavya Gupta:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Final = Table.FromColumns(
    List.Transform(
      List.Transform(
        {1, 0}, 
        (s) =>
          List.Sort(
            List.Distinct(
              List.Combine(
                Table.TransformRows(
                  Source, 
                  each Splitter.SplitTextByAnyDelimiter({"A" .. "Z"})([String])
                )
              )
            ), 
            {each Number.From(_), s}
          )
      ), 
      (l) => List.Transform(List.FirstN(List.Select(l, each _ <> ""), 3), Number.From)
    ), 
    {"Top 3 Max", "Top 3 Min"}
  )
in
  Final
Power Query solution 7 for Extract Top Number Groups, proposed by Matthias Friedmann:
let
  Source = Excel.CurrentWorkbook(){[Name = "MinMaxString"]}[Content], 
  list = List.Transform(
    List.Distinct(Text.SplitAny(Text.Combine(Source[String], "A"), Text.Combine({"A" .. "Z"}))), 
    Number.From
  ), 
  top = Table.FromColumns({List.MaxN(list, 3), List.MinN(list, 3)}, {"Top 3 Max", "Top 3 Min"})
in
  top
Power Query solution 8 for Extract Top Number Groups, proposed by Krzysztof Kominiak:
let
  Source = Data, 
  Ls = List.Union(
    Table.TransformColumns(
      Source, 
      {
        "String", 
        each List.Transform(Splitter.SplitTextByAnyDelimiter({"A" .. "Z"})(_), each Number.From(_))
      }
    )[String]
  ), 
  Result = Table.FromColumns({List.MaxN(Ls, 3)} & {List.MinN(Ls, 3)}, {"Top 3 Max", "Top 3 Min"})
in
  Result
Power Query solution 9 for Extract Top Number Groups, proposed by Jan Willem Van Holst:
let
 Source = Your Data,
 Split = Table.TransformColumns(Source,{{"String", Splitter.SplitTextByCharacterTransition({"0".."9"}, {"A".."Z"})}}),
 #"Expanded String" = Table.ExpandListColumn(Split, "String"),
 #"Split Column by Character Transition" = Table.SplitColumn(#"Expanded String", "String", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"String.1", "String.2"}),
 #"Filtered Rows" = Table.SelectRows(#"Split Column by Character Transition", each ([String.2] <> null)),
 #"Changed Type" = Table.TransformColumnTypes(#"Filtered Rows",{{"String.2", Int64.Type}}),
 #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"String.1"}),
 myList = List.Sort(List.Distinct(#"Removed Columns"[String.2]))
 
in
 Table.FromColumns({List.Sort(List.LastN(myList,3), Order.Descending), List.FirstN(myList,3)}, {"Top 3 max", "Top 3 Min"})
                    
                  
          

Solving the challenge of Extract Top Number Groups with Excel

Excel solution 1 for Extract Top Number Groups, proposed by Rick Rothstein:
=LET(
    t,
    TEXTJOIN(
        "X",
        ,
        A2:A11
    ),
    m,
    MID(
        t,
        SEQUENCE(
            LEN(
                t
            )
        ),
        1
    ),
    AGGREGATE(
        {14,
        15},
        6,
        UNIQUE(
            0+TEXTSPLIT(
                TRIM(
                    CONCAT(
                        IFERROR(
                            0+m,
                            " "
                        )
                    )
                ),
                " "
            ),
            1
        ),
        {1;2;3}
    )
)
Excel solution 2 for Extract Top Number Groups, proposed by John V.:
=AGGREGATE(
    {14,
    15},
    6,
    UNIQUE(
        --TEXTSPLIT(
            CONCAT(
                A2:A11&"J"
            ),
            ,
            CHAR(
                ROW(
                    65:90
                )
            )
        )
    ),
    {1;2;3}
)

p.d: Bo Rydobon has a similar approach.  I didn't see it when I posted this attempt)
Excel solution 3 for Extract Top Number Groups, proposed by محمد حلمي:
=LET(
    
    a,
    UNIQUE(
        TEXTSPLIT(
            CONCAT(
                A2:A11&" "
            ),
            ,
            
            VSTACK(
                " ",
                CHAR(
                    ROW(
                        65:90
                    )
                )
            ),
            1
        )
    )+0,
    
    r,
    ROW(
        1:3
    ),
    
    HSTACK(
        LARGE(
            a,
            r
        ),
        SMALL(
            a,
            r
        )
    )
)
Excel solution 4 for Extract Top Number Groups, proposed by محمد حلمي:
=REDUCE(
    0,
    A2:A11,
    LAMBDA(
        a,
        d,
        LET(
            
            s,
            TEXTSPLIT(
                d,
                CHAR(
                    ROW(
                        65:90
                    )
                ),
                ,
                1
            )+0,
            
            i,
            VSTACK(
                a,
                HSTACK(
                    MAX(
                        s
                    ),
                    MIN(
                        s
                    )
                )
            ),
            
            TAKE(
                HSTACK(
                    
                    SORT(
                        UNIQUE(
                            TAKE(
                                i,
                                ,
                                1
                            )
                        ),
                        ,
                        -1
                    ),
                    
                    SORT(
                        UNIQUE(
                            DROP(
                                i,
                                ,
                                1
                            )
                        )
                    )
                ),
                3
            )
        )
    )
)
Excel solution 5 for Extract Top Number Groups, proposed by 🇰🇷 Taeyong Shin:
=AGGREGATE(
    {14,
    15},
    ,
    UNIQUE(
        --REGEXEXTRACT(
            ARRAYTOTEXT(
                A2:A11
            ),
            "d+",
            1
        ),
        1
    ),
    {1;2;3}
)

=LET(
    s,
    {1;2;3},
    WRAPCOLS(
        CHOOSEROWS(
            GROUPBY(
                --TEXTSPLIT(
                    CONCAT(
                        A2:A11&"A"
                    ),
                    ,
                    CHAR(
                        SEQUENCE(
                            26,
                            ,
                            65
                        )
                    ),
                    1
                ),
                ,
                ,
                ,
                0
            ),
            -s,
            s
        ),
        3
    )
)
Excel solution 6 for Extract Top Number Groups, proposed by Kris Jaganah:
=LET(
    a,
    UNIQUE(
        TOCOL(
            TEXTSPLIT(
                TEXTJOIN(
                    "@",
                    TRUE,
                    A2:A11
                ),
                ,
                CHAR(
                    SEQUENCE(
                        ,
                        27,
                        64
                    )
                )
            )/1,
            3
        )
    ),
    HSTACK(
        LARGE(
            a,
            {1;2;3}
        ),
        SMALL(
            a,
            {1;2;3}
        )
    )
)
Excel solution 7 for Extract Top Number Groups, proposed by Julian Poeltl:
=LET(
    C,
    TEXTJOIN(
        "A",
        ,
        A2:A11
    ),
    N,
    TEXTSPLIT(
        C,
        CHAR(
            64+SEQUENCE(
                26
            )
        )
    ),
    F,
    UNIQUE(
        --FILTER(
            N,
            N<>""
        ),
        1
    ),
    HSTACK(
        LARGE(
            F,
            SEQUENCE(
                3
            )
        ),
        SMALL(
            F,
            SEQUENCE(
                3
            )
        )
    )
)
Excel solution 8 for Extract Top Number Groups, proposed by Timothée BLIOT:
=LET(
    A,
    A2:A11,
     B,
    1*TEXTSPLIT(
        TEXTJOIN(
            "/",
            ,
            BYROW(
                A,
                LAMBDA(
                    a,
                    TEXTJOIN(
                        ",",
                        ,
                        TEXTSPLIT(
                            a,
                            TEXTSPLIT(
                                a,
                                SEQUENCE(
                                    10,
                                    ,
                                    0
                                ),
                                ,
                                1
                            ),
                            ,
                            1
                        )
                    )
                )
            )
        ),
        ",",
        "/",
        1,
        ,
        ""
    ),
     C,
    SORT(
        UNIQUE(
            TOCOL(
                B,
                3
            )
        ),
        ,
        -1
    ),
     HSTACK(
         TAKE(
             C,
             3
         ),
         TAKE(
             C,
             -3
         )
     )
)
Excel solution 9 for Extract Top Number Groups, proposed by Bhavya Gupta:
=LET(
    a,
    SORT(
        UNIQUE(
            TEXTSPLIT(
                CONCAT(
                    Table1[String]&"["
                ),
                ,
                CHAR(
                    SEQUENCE(
                        27,
                        ,
                        65
                    )
                ),
                TRUE
            )*1
        )
    ),
    HSTACK(
        SORT(
            TAKE(
                a,
                -3
            ),
            ,
            -1
        ),
        TAKE(
            a,
            3
        )
    )
)
Excel solution 10 for Extract Top Number Groups, proposed by Md. Zohurul Islam:
=LET(
    
    hdr,
    HSTACK(
        "Top 3 Max",
        "Top 3 Min"
    ),
    
    a,
    A2:A11,
    
    b,
    TEXTJOIN(
        ",",
        ,
        a
    ),
    
    seq,
    SEQUENCE(
        LEN(
            b
        )
    ),
    
    d,
    IFERROR(
        MID(
            b,
            seq,
            1
        )+0,
        "-"
    ),
    
    e,
    CONCAT(
        d
    ),
    
    f,
    TOCOL(
        0+TEXTSPLIT(
            e,
            "-"
        ),
        3
    ),
    
    mx,
    TAKE(
        UNIQUE(
            SORT(
                f,
                ,
                -1
            )
        ),
        3
    ),
    
    mn,
    TAKE(
        UNIQUE(
            SORT(
                f
            )
        ),
        3
    ),
    
    rng,
    HSTACK(
        mx,
        mn
    ),
    
    result,
    VSTACK(
        hdr,
        rng
    ),
    
    result
)
Excel solution 11 for Extract Top Number Groups, proposed by Stefan Olsson:
=LAMBDA(
    a,
    
    {SORTN(
        a,
        3,
        2,
        1,
        FALSE
    ),
     SORTN(
         a,
         3,
         2
     )}
    
)
(FLATTEN(
    
    SPLIT(
        
        REGEXREPLACE(
            
            TEXTJOIN(
                "|",
                TRUE ,
&                A2:A11
            ),
            
            "D",
            "|"
        ),
        
        "|",
        TRUE,
        TRUE
    )
    
))
Excel solution 12 for Extract Top Number Groups, proposed by Stefan Olsson:
=LAMBDA(
    a,
    
    {SORTN(
        a,
         3,
         2,
         1,
         false
    ),
     SORTN(
         a,
          3,
          2
     )}
    
)(
FLATTEN(
    
    SPLIT(
        
        TEXTJOIN(
            "A",
             true,
             A2:A11
        ),
        
        "ABCDEFGHIJKLMNOPQRSTUVXYZ",
         true,
         true 
    )
    
))
Excel solution 13 for Extract Top Number Groups, proposed by Victor Momoh (MVP, MOS, R.Eng):
=LET(
    a,
    SORT(
        UNIQUE(
            0+TEXTSPLIT(
                TEXTJOIN(
                    "A",
                    1,
                    A2:A11
                ),
                ,
                CHAR(
                    SEQUENCE(
                        26,
                        ,
                        65
                    )
                ),
                1
            )
        )
    ),
    
    HSTACK(
        SORT(
            TAKE(
                a,
                -3
            ),
            ,
            -1
        ),
        TAKE(
            a,
            3
        )
    )
)
Excel solution 14 for Extract Top Number Groups, proposed by Abhishek Kumar Jain:
=LET(
    a,
    SORT(
        UNIQUE(
            --TEXTSPLIT(
                TEXTJOIN(
                    "A",
                    1,
                    A2:A11
                ),
                ,
                CHAR(
                    SEQUENCE(
                        26,
                        ,
                        65
                    )
                ),
                1
            )
        )
    ),
    b,
    LARGE(
        a,
        {1;2;3}
    )&"-"&SMALL(
        a,
        {1;2;3}
    ),
    TEXTSPLIT(
        TEXTJOIN(
            "|",
            1,
            b
        ),
        "-",
        "|"
    )
)
Excel solution 15 for Extract Top Number Groups, proposed by Philippe Brillault:
=LET(
    x,
    SORT(
        UNIQUE(
            --REGEX.EXTRACT(
                CONCAT(
                    A2:A11&"Z"
                ),
                "(d+)",
                1
            ),
            1
        ),
        ,
        -1,
        1
    ),
    WRAPCOLS(
        HSTACK(
            TAKE(
                x,
                ,
                3
            ),
            SORT(
                TAKE(
                    x,
                    ,
                    -3
                ),
                ,
                ,
                1
            )
        ),
        3
    )
)
Excel solution 16 for Extract Top Number Groups, proposed by Fábio Gatti:
=LAMBDA(
    Array,
    nRanking,
    
     LET(
         
          fxRow,
         LAMBDA(
             Row,
             TEXTJOIN(
                 ";",
                 1,
                 TEXTSPLIT(
                     Row,
                     ,
                     CHAR(
                         SEQUENCE(
                             26,
                             ,
                             65
                         )
                     ),
                     1
                 )
             )
         ),
         
          vValues,
         TEXTJOIN(
             ";",
             1,
             BYROW(
                 A2:A11,
                 fxRow
             )
         ),
         
          xValues,
         UNIQUE(
             --TEXTSPLIT(
                 vValues,
                 ,
                 ";"
             )
         ),
         
          xRangeRanking,
         SEQUENCE(
             nRanking
         ),
         
         
          xTopValues,
         LARGE(
             xValues,
             xRangeRanking
         ),
         
          xMinValues,
         SMALL(
             xValues,
             xRangeRanking
         ),
         
         
          xHeaders,
         HSTACK(
             "Top "&nRanking&" Max",
             "Top "&nRanking&" Min"
         ),
         
          xData,
         HSTACK(
             xTopValues,
             xMinValues
         ),
         
         
          VSTACK(
              xHeaders,
              xData
          )
          
     )
    
)(A2:A11,
    3)

Solving the challenge of Extract Top Number Groups with SQL

SQL solution 1 for Extract Top Number Groups, proposed by Zoran Milokanović:
WITH /* Microsoft SQL Server 2019 */
DATA_PREP
AS
(
 SELECT
 T.STRING
 ,T.LETTERS
 ,TRANSLATE(T.STRING, T.LETTERS, REPLICATE(' ', DATALENGTH(T.LETTERS))) AS NUMBERS
 FROM
 (
 SELECT
 D.STRING
 ,TRANSLATE(D.STRING, '0123456789', '     ') AS LETTERS
 FROM DATA D
 ) T
),
CALC
AS
(
 SELECT DISTINCT
 CAST(VALUE AS DECIMAL) AS NUMBER
 ,DENSE_RANK() OVER (ORDER BY CAST(VALUE AS DECIMAL)) AS TOP_MIN
 ,DENSE_RANK() OVER (ORDER BY CAST(VALUE AS DECIMAL) DESC) AS TOP_MAX
 FROM DATA_PREP DP
 CROSS APPLY STRING_SPLIT(DP.NUMBERS, ' ')
 WHERE
 VALUE <> ''
)
SELECT
 MX.NUMBER AS TOP_3_MAX
,MN.NUMBER AS TOP_3_MIN
FROM CALC MX 
JOIN CALC MN ON MN.TOP_MIN = MX.TOP_MAX
WHERE
 MX.TOP_MAX <= 3
ORDER BY
 MX.TOP_MAX
;
                    
                  

&&

Leave a Reply