Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

The Power BI Data Visualization World Championships is back! It's time to submit your entry. Live now!

Reply
supermulder
Frequent Visitor

Calculate difference between two rows

 Hi there,

 

i have a simple table with 2 columns

 

date / value

2016-02-10 / 1000

2016-02-11 / 1200

2016-02-12 / 1500

 

What i need is a dynamic column "diff" that considers the difference in value between each row -

 

date / value / diff

2016-02-10 / 1000 / 0

2016-02-11 / 1200 / 200

2016-02-12 / 1500 / 300

 

What i have tried is:

diff  ='Table'[value]) - CALCULATE(COUNT('Table'[value]);FILTER('Table';'Table'[date] = DATEVALUE('Table'[date] - 1)))

 

With this formula i get no result - do you have any idea what to do ?

 

Thank you!

 

 

 

4 REPLIES 4
fbrossard
Kudo Commander
Kudo Commander

Hi @supermulder,

 

It depends on your needs, if you measure is  "context filter" depend, you should you @MattAllington DAX solution.

If not, you can also precalc the diff at leaf level with Power Queery by implementing running total techniques with Power Query :

 

1. Create you data source query (for example SampleDataSource), order you data by "date" column, add a first index starting by 1, add a second index called previous index starting by 0 and modify your query in order to create only connection . You should have this M code :

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjIwNNM1MNI1NFDSUTI0MDBQitVBEjUEiRqhixqBRE1BorEA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, Value = _t]),
    #"Change type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Value", Int64.Type}}),
    #"Order rows" = Table.Sort(#"Change type",{{"Date", Order.Ascending}}),
    #"Add index started by 1" = Table.AddIndexColumn(#"Order rows", "Index", 1, 1),
    #"Add index started by 0" = Table.AddIndexColumn(#"Add index started by 1", "Previous Index", 0, 1)
in
    #"Add index started by 0"

 

 

2. Create a new query by Referecing the first one (for example Sample). Merge the 2 queries with left join by using Sample.Previous Index = SampleDataSource.Index. Expand the referenced table to get the value, calc the diff and remove all temp columns. Finally, you should have this M Code :

let
    Source = SampleDataSource,
    #"Merge queries" = Table.NestedJoin(Source,{"Previous Index"},SampleDataSource,{"Index"},"Previous",JoinKind.LeftOuter),
    #"Previous expdanded" = Table.ExpandTableColumn(#"Merge queries", "Previous", {"Value"}, {"Previous.Value"}),
    #"Add custom column Diff" = Table.AddColumn(#"Previous expdanded", "Diff", each [Value] - [Previous.Value]),
    #"Delete temp columns" = Table.RemoveColumns(#"Add custom column Diff",{"Index", "Previous Index", "Previous.Value"})
in
    #"Delete temp columns"

 

Just use diff column on your visuals.

 

 

MattAllington
Community Champion
Community Champion

Can I ask why you need this column?  It is not something that I would consider normal DAX. What are you trying to achieve in the end?



* Matt is an 8 times Microsoft MVP (Power BI) and author of the Power BI Book Supercharge Power BI.
I will not give you bad advice, even if you unknowingly ask for it.

In value i have always the cumulated value over all - it´s perfect for display in a line widget for example - but what i want is a quick overview about the absolute performance over a given period to display.

 

So at the moment i have

 

day 1: 20000

day 2: 30000

day 3: 40000

 

What i want additionaly is the growth between days:

day 1: 0

day 2: 10000

day 3: 10000

 

At the end i want to display this values in a bar-widget for the last 7 days and more cumulated for month and quarter reports - i hope you unterstand what my intention is.

 

So do you always only have 1 record per day? Either way it doesn't really matter   I would connect the data table to a calendar table, make a working day ID column in the calendar table (start at 1 and increment by 1 for each day).  Null or zero for a non working day.

eg

0 = Sunday 

1

2

3

4

5

0

0

6

7

8

9

10

0

0

etc

 

 Then write measures (not a calc column) like this

 

Today=sum(table[value])

Previous working day =calculate(sum(table[value]),filter(all(calendar),calendar[ID] =max(calendar[ID])-1))

chg vs prior working day = [Today] - [Previous a Working Day]

 

set a matrix, put the calendar[date] on rows and then add the three measures. 

 

Edit: you may want to repeat the ID number for the last working day instead of blanks. 

0

1

2

3

4

5

5

5

6

7

8

9

10

10

10

etc



* Matt is an 8 times Microsoft MVP (Power BI) and author of the Power BI Book Supercharge Power BI.
I will not give you bad advice, even if you unknowingly ask for it.

Helpful resources

Announcements
December 2025 Power BI Update Carousel

Power BI Monthly Update - December 2025

Check out the December 2025 Power BI Holiday Recap!

FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.