Forum Discussion

tolrahC's avatar
tolrahC
Regular Visitor
9 years ago
Solved

Sub aggregation between records

Hi,

 

With the following table

 

TimestampWoodFuel
2017-02-16 01:00300 
2017-02-16 02:00 30
2017-02-16 03:00 40
2017-02-16 06:00 50
2017-02-16 12:00180 

 

I'd like to get an aggregation of the Fuel column for the values between each Wood column value.  Is that possible directly within PowerBI?

 

In my example I would expect a sum value of 120 for 2017-02-16 01:00.

 

Thank you

  • MarcelBeug's avatar
    MarcelBeug
    9 years ago

    An "Artist Impression" in this video (explaining the code below) how it could look like in Power Query with the data from an Excel file.

     

    let
        Source = Excel.Workbook(File.Contents("C:\Users\Marcel\Documents\Forum bijdragen\Power BI Community\Subaggregation between values.xlsx"), null, true),
        Tabel1_Table = Source{[Item="Tabel1",Kind="Table"]}[Data],
        #"Changed Type" = Table.TransformColumnTypes(Tabel1_Table,{{"Timestamp", type datetime}, {"Wood", Int64.Type}, {"Fuel", Int64.Type}}),
        #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
        #"Added Custom" = Table.AddColumn(#"Added Index", "StartIndex", each if [Wood] = null then [Index] else null, Int64.Type),
        #"Filled Up" = Table.FillUp(#"Added Custom",{"StartIndex"}),
        #"Added Custom1" = Table.AddColumn(#"Filled Up", "EndIndex+1", each if [Wood] <> null then [Index] else null),
        #"Filled Up1" = Table.FillUp(#"Added Custom1",{"EndIndex+1"}),
        #"Added Index1" = Table.AddIndexColumn(#"Filled Up1", "Index.1", 1, 1),
        #"Merged Queries" = Table.NestedJoin(#"Added Index1",{"Index.1"},#"Added Index1",{"Index"},"NewColumn",JoinKind.LeftOuter),
        #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Index", "EndIndex+1", "Index.1"}),
        #"Expanded NewColumn" = Table.ExpandTableColumn(#"Removed Columns", "NewColumn", {"EndIndex+1"}, {"EndIndex+1"}),
        #"Inserted Subtraction" = Table.AddColumn(#"Expanded NewColumn", "Count", each [#"EndIndex+1"] - [StartIndex], type number),
        #"Added Custom2" = Table.AddColumn(#"Inserted Subtraction", "TotalFuel", each if [Wood] <> null and [StartIndex] <> null then List.Sum(List.Range(#"Removed Columns"[Fuel],[StartIndex],[Count])) else null),
        #"Removed Columns1" = Table.RemoveColumns(#"Added Custom2",{"StartIndex", "EndIndex+1", "Count"})
    in
        #"Removed Columns1"

6 Replies

  • Phil_Seamark's avatar
    Phil_Seamark
    Microsoft Employee

    It would be a lot easier if you could have a 4th column with something like a JobID to link the records together.  That way the dax would just be a simple SUM over the Fuel column.  Is there any extra data you can find?

     

    But I will post some DAX in a tick to show you how you can do it without a jobID

     

    TimestampJobIDWoodFuel
    2017-02-16 01:001300 
    2017-02-16 02:001 30
    2017-02-16 03:001 40
    2017-02-16 06:001 50
    2017-02-16 12:002180 

     

     

    • tolrahC's avatar
      tolrahC
      Regular Visitor

      Thanks Phil_Seamark,

       

      If you can show me to do it without a jobid it would be appreciated.

      • Phil_Seamark's avatar
        Phil_Seamark
        Microsoft Employee

        Here is what I have so far and as you can see there are a few steps.

         

        I probably need more data from you to test the ranking is working correctly.

         

        I'm guessing it will be easier to do in your source data or via the query editor in Power Query.

         

        Table = var d = SELECTCOLUMNS(
                                FILTER('Table1',
                                    Table1[Wood] <> BLANK()
                                    ),
                        "Timestamp" , 'Table1'[Timestamp] ,
                        "Wood" , 'Table1'[Wood] 
                        )
                var r = SELECTCOLUMNS(d, "Timestamp" , [Timestamp] , "Wood" , [Wood],  "Rank" ,  RANKX(d, [Timestamp],,ASC))    
                var l = SELECTCOLUMNS(r,"rank",[Rank]-1 , "EndTime" , [Timestamp])
                var p = SELECTCOLUMNS(r,"rank",[Rank] , "StartTime" , [Timestamp], "Wood2" , [Wood])
                var x = NATURALINNERJOIN(p,l)
                var f = CROSSJOIN(x,Table1)  
                var y = filter(f,'Table1'[Timestamp]< [EndTime] && 'Table1'[Timestamp]>=[StartTime])
                return SELECTCOLUMNS(y,"Wood",[Wood2] , "Time" , [Timestamp] , "Fuel" , [Fuel])