Forum Discussion

lazarus1907's avatar
lazarus1907
Icon for Helper I rankHelper I
6 years ago
Solved

Counting blocks of consecutive numbers -is it possible?

Hi, I don't mind whether this can be done in M or DAX, as long as it is done without other languages like Python (which are not enabled for me). Is it possible at all to get a list of blocks of co...
  • ImkeF's avatar
    ImkeF
    6 years ago

    Sorry lazarus1907 ,

    my bad. Forgot that this technique always compares against the first element in the group and not against the previous.

    I'd recommend this approach then instead:

     

    let
      // Replace this Source step by a reference to your table
      Source = Table.FromRows(
          Json.Document(
              Binary.Decompress(
                  Binary.FromText(
                      "JcqxEQAgCAPAXVJTEBQdhmP/NTxD98VXgTDQHW2FkCkvOeT9zTkpzznynCsnuh8=", 
                      BinaryEncoding.Base64
                    ), 
                  Compression.Deflate
                )
            ), 
          let
            _t = ((type nullable text) meta [Serialized.Text = true])
          in
            type table [Ref = _t, Code = _t]
        ),
      #"Changed Type" = Table.TransformColumnTypes(Source, {{"Ref", Int64.Type}, {"Code", Int64.Type}}),
      ToList = List.Buffer(Table.ToRecords(#"Changed Type")),
      AllBucketID = List.Generate(
          () => Record.AddField(Record.AddField(ToList{0}, "CountAll", 0), "CountGroup", 0), 
          each [CountAll] <= List.Count(ToList), 
          each [
            CountAll = [CountAll] + 1, 
            CountGroup = 
              if [Code] = ToList{[CountAll]}[Code] - 1 then 
                [CountGroup]
              else 
                [CountGroup] + 1, 
            Code = ToList{[CountAll]}[Code], 
            Ref = ToList{[CountAll]}[Ref]
          ]
        ),
      SkipInitialElement = List.Skip(AllBucketID),
      #"Converted to Table" = Table.FromList(
          SkipInitialElement, 
          Splitter.SplitByNothing(), 
          null, 
          null, 
          ExtraValues.Error
        ),
      #"Expanded Column1" = Table.ExpandRecordColumn(
          #"Converted to Table", 
          "Column1", 
          {"Ref", "Code", "CountGroup"}, 
          {"Ref", "Code", "CountGroup"}
        ),
      #"Grouped Rows" = Table.Group(
          #"Expanded Column1", 
          {"CountGroup"}, 
          {
            {"Ref", each List.Max([Ref]), type number}, 
            {"Code", each List.Max([Code]), type number}, 
            {"Count", each Table.RowCount(_), Int64.Type}
          }, 
          GroupKind.Local
        ),
      #"Removed Columns" = Table.RemoveColumns(#"Grouped Rows", {"CountGroup"})
    in
      #"Removed Columns"

     

  • Anonymous's avatar
    Anonymous
    6 years ago

     

    using an auxiliary index column, the V element of the table.group function can dig the spider out of the hole.

     

     

    let
        Origine = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("Lc3LDcAwCATRXjjn4AV/a7HcfxtJBt/eSGjZ22SPSWHn2ea44sANV9xxwwN3PPHAC8/P7rmzcO6oEDkkEbkkJ3JKQeSW/udR71kj7lkn7tn/P1rJmIQyFuF2zgs=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Colonna1 = _t, Colonna2 = _t]),
        #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"Colonna2", Int64.Type}}),
       aci = Table.AddIndexColumn(#"Modificato tipo", "Indice", 0, 1, Int64.Type),
        #"Modificato tipo1" = Table.TransformColumnTypes(aci,{{"Colonna2", Int64.Type}}),
        #"Raggruppate righe" = Table.Group(#"Modificato tipo1", {"Colonna2", "Indice"}, {{"last", each Table.Last(_)},{"Conteggio", each Table.RowCount(_), Int64.Type}}, GroupKind.Local,(x,y)=>-x[Colonna2]+y[Colonna2]-(y[Indice]-x[Indice])),
        #"Tabella ref espansa" = Table.ExpandRecordColumn(#"Raggruppate righe", "last", {"Colonna1", "Colonna2"}, {"ref", "code"}),
        #"Rimosse colonne" = Table.RemoveColumns(#"Tabella ref espansa",{"Colonna2", "Indice"})
    in
        #"Rimosse colonne"

     

     

    PS

    questa soluzione presuppone che la tabella sia ordina in senso crescente nella colonna Code.