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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
TheHans
Helper I
Helper I

Calculate a difference for values of max date with previous date

Hi,

I have a table with IDs, dates and values per ID-Date combination. I would like to calculate the difference of the values compared to the previous date for the same ID.

For example: ID 1 increased from 01.11.2021 to 02.11.2021 by 5. So the result is 5.
If an ID was not there on the previous date, the value would be null.
For example: ID 4 came in on 03.11.2021 with the value of 10. The diff prev. date is null since there is no previous date with this ID.

How do I calculate this new "Diff prev. date" column using DAX`?

Thanks in advance.

 

IDDateValueDiff prev. date
101.11.202110null
201.11.202110null
301.11.202110null
102.11.2021155
202.11.20218-2
302.11.2021100
103.11.2021150
203.11.2021113
303.11.2021100
403.11.202110null
1 ACCEPTED SOLUTION
smpa01
Super User
Super User

@TheHans  you can use a measure like this

 

 

VAR _sum =
    SUM ( 'Table 1'[Value] )
VAR _id =
    MAX ( 'Table 1'[ID] )
VAR _date =
    MAX ( 'Table 1'[Date] )
VAR _immediatelyPrecedingSum =
    CALCULATE (
        SUM ( 'Table 1'[Value] ),
        FILTER (
            ALL ( 'Table 1' ),
            'Table 1'[Date]
                = CALCULATE (
                    MAX ( 'Table 1'[Date] ),
                    'Table 1'[Date] < _date,
                    ALLEXCEPT ( 'Table 1', 'Table 1'[ID] )
                )
                && 'Table 1'[ID] = _id
        )
    )
RETURN
    IF ( _immediatelyPrecedingSum = BLANK (), 0, _sum - _immediatelyPrecedingSum )

 

 

smpa01_0-1637935522738.png

 

If you need a calulated column

 

Column = 
VAR _sum =
    CALCULATE ( SUM ( tbl[Value] ) )
VAR _immediatelyPreceding =
    MAXX (
        FILTER (
            tbl,
            tbl[ID] = EARLIER ( tbl[ID] )
                && tbl[Date] < EARLIER ( tbl[Date] )
        ),
        tbl[Date]
    )
VAR _imediatelyPrecedingSum =
    SUMX (
        FILTER (
            tbl,
            tbl[ID] = EARLIER ( tbl[ID] )
                && tbl[Date] = _immediatelyPreceding
        ),
        tbl[Value]
    )
RETURN
    IF ( _imediatelyPrecedingSum = BLANK (), 0, _sum - _imediatelyPrecedingSum )

 

 

smpa01_1-1637936262566.png

 

 

Did I answer your question? Mark my post as a solution!
Proud to be a Super User!
My custom visualization projects
Plotting Live Sound: Viz1
Beautiful News:Viz1, Viz2, Viz3
Visual Capitalist: Working Hrs

View solution in original post

4 REPLIES 4
CNENFRNL
Community Champion
Community Champion

 

Diff_CC = 
VAR __prev =
    MAXX(
        TOPN( 1, FILTER( Table1,
                Table1[ID] = EARLIER( Table1[ID] )
                    && Table1[Date] < EARLIER( Table1[Date] ) ),
            Table1[Date]
        ),
        Table1[Value]
    )
RETURN
    IF( NOT ISBLANK( __prev ), Table1[Value] - __prev )

 

Screenshot 2021-11-27 023624.png

 

Diff = 
VAR __prev =
    MAXX(
        TOPN(
            1,
            CALCULATETABLE(
                Table1,
                Table1[Date] < MAX( Table1[Date] ),
                ALLEXCEPT( Table1, Table1[ID] )
            ),
            Table1[Date]
        ),
        [Total]
    )
RETURN
    IF( NOT ISBLANK( __prev ), [Total] - __prev )

 

Screenshot 2021-11-27 023806.png


Thanks to the great efforts by MS engineers to simplify syntax of DAX! Most beginners are SUCCESSFULLY MISLED to think that they could easily master DAX; but it turns out that the intricacy of the most frequently used RANKX() is still way beyond their comprehension!

DAX is simple, but NOT EASY!

Hi CNENFRNL,

 

thanks a lot. Appreciate your support.

H

smpa01
Super User
Super User

@TheHans  you can use a measure like this

 

 

VAR _sum =
    SUM ( 'Table 1'[Value] )
VAR _id =
    MAX ( 'Table 1'[ID] )
VAR _date =
    MAX ( 'Table 1'[Date] )
VAR _immediatelyPrecedingSum =
    CALCULATE (
        SUM ( 'Table 1'[Value] ),
        FILTER (
            ALL ( 'Table 1' ),
            'Table 1'[Date]
                = CALCULATE (
                    MAX ( 'Table 1'[Date] ),
                    'Table 1'[Date] < _date,
                    ALLEXCEPT ( 'Table 1', 'Table 1'[ID] )
                )
                && 'Table 1'[ID] = _id
        )
    )
RETURN
    IF ( _immediatelyPrecedingSum = BLANK (), 0, _sum - _immediatelyPrecedingSum )

 

 

smpa01_0-1637935522738.png

 

If you need a calulated column

 

Column = 
VAR _sum =
    CALCULATE ( SUM ( tbl[Value] ) )
VAR _immediatelyPreceding =
    MAXX (
        FILTER (
            tbl,
            tbl[ID] = EARLIER ( tbl[ID] )
                && tbl[Date] < EARLIER ( tbl[Date] )
        ),
        tbl[Date]
    )
VAR _imediatelyPrecedingSum =
    SUMX (
        FILTER (
            tbl,
            tbl[ID] = EARLIER ( tbl[ID] )
                && tbl[Date] = _immediatelyPreceding
        ),
        tbl[Value]
    )
RETURN
    IF ( _imediatelyPrecedingSum = BLANK (), 0, _sum - _imediatelyPrecedingSum )

 

 

smpa01_1-1637936262566.png

 

 

Did I answer your question? Mark my post as a solution!
Proud to be a Super User!
My custom visualization projects
Plotting Live Sound: Viz1
Beautiful News:Viz1, Viz2, Viz3
Visual Capitalist: Working Hrs

Hi smpa01,

thanks for the solution. Especially for both ways, as measure and calculated column.

H

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors