Don't miss your chance to take the Fabric Data Engineer (DP-700) exam on us!
Learn moreWe've captured the moments from FabCon & SQLCon that everyone is talking about, and we are bringing them to the community, live and on-demand. Starts on April 14th. Register now
Hi there,
I am using Power BI Desktop: Version: 2.130.930.0 64-bit (June 2024)
I need to create a 7 new columns / measures in DAX to analyze the changes by comparing the latest date data with data in exactly 1 day prior. In my case here, I only want to compare data in 6/19 with data in 6/18, and don't want to compare to data in 6/17 (for example).
here is the raw table :
| id | bu | type | date |
| 208 | 10 | red | 6/18/2024 |
| 209 | 10 | red | 6/18/2024 |
| 210 | 10 | red | 6/18/2024 |
| 211 | 10 | red | 6/18/2024 |
| 209 | 10 | red | 6/19/2024 |
| 210 | 20 | red | 6/19/2024 |
| 211 | 10 | blue | 6/19/2024 |
| 212 | 10 | red | 6/19/2024 |
Here is the final table wanted:
| id | bu | type | date | exist_prior | exist_new | transfer_in | transfer_out | converted | removed | ending |
| 208 | 10 | red | 6/18/2024 | 1 | 0 | 0 | 0 | 0 | -1 | 0 |
| 209 | 10 | red | 6/18/2024 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 210 | 10 | red | 6/18/2024 | 1 | 0 | 0 | -1 | 0 | 0 | 0 |
| 211 | 10 | red | 6/18/2024 | 1 | 0 | 0 | 0 | -1 | 0 | 0 |
| 209 | 10 | red | 6/19/2024 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 210 | 20 | red | 6/19/2024 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
| 211 | 10 | blue | 6/19/2024 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
| 212 | 10 | red | 6/19/2024 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
id - whole number
bu - whole number
type - text
date - date
the 7 new columns / measures wanted are defined as follows:
Thank you so much for your advice and help!
Solved! Go to Solution.
@zenz - If you want these as calculated columns, please use the below DAX:
exist_prior =
VAR _id = 'Table (2)'[id]
VAR date_prior = 'Table (2)'[date] + 1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior , 'Table (2)'[id] = _id)
RETURN
if( ISBLANK(id_prior),0,1)
-------------------
exist_new =
VAR _id = 'Table (2)'[id]
VAR date_prior = 'Table (2)'[date] -1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id )
VAR min_date = CALCULATE( min( 'Table (2)'[date] ), REMOVEFILTERS( 'Table (2)' ))
RETURN
if( ISBLANK( id_prior ),if('Table (2)'[date] = min_date,0,1),0)
-------------------
Transfer In =
VAR _id = 'Table (2)'[id]
VAR _bu = 'Table (2)'[bu]
VAR date_prior = 'Table (2)'[date] +1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id, 'Table (2)'[bu] <> _bu )
RETURN
if( ISBLANK( id_prior ),0,1)
--------------------
Transfer Out =
VAR _id = 'Table (2)'[id]
VAR _bu = 'Table (2)'[bu]
VAR date_prior = 'Table (2)'[date] -1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id, 'Table (2)'[bu] <> _bu )
RETURN
if( ISBLANK( id_prior ),0,-1)
---------------------
VAR _id = 'Table (2)'[id]
VAR _type = 'Table (2)'[type]
VAR date_prior = 'Table (2)'[date] -1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id, 'Table (2)'[type] <> _type )
VAR date_future = 'Table (2)'[date] + 1
VAR id_future = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_future, 'Table (2)'[id] = _id, 'Table (2)'[type] <> _type )
RETURN
SWITCH( TRUE() , id_prior = 'Table (2)'[id], 1, id_future = 'Table (2)'[id], -1 ,0 )
-------------------------
Removed =
VAR _id = 'Table (2)'[id]
VAR date_prior = 'Table (2)'[date] +1
VAR id_prior = CALCULATETABLE(VALUES('Table (2)'[id]), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior , 'Table (2)'[id] = _id)
VAR id_in_prior = CALCULATE( MAX( 'Table (2)'[id] ), not('Table (2)'[id]) in { id_prior })
VAR max_date = CALCULATE( MAX( 'Table (2)'[date] ), REMOVEFILTERS( 'Table (2)' ))
RETURN
if( ISBLANK( id_in_prior ), 0,if('Table (2)'[date] = max_date, 0,-1 ))
-------------------------
Ending =
VAR max_date = CALCULATE( MAX( 'Table (2)'[date] ), REMOVEFILTERS( 'Table (2)' ))
RETURN
if( 'Table (2)'[date] = max_date, 1,0 )
Screen shot shows they work as requested:
If you would like to make them measures, you just need to bt every 'Table'[Column]' reference in a filter or VAR inside SELECTEDVALUE - e.g. VAR _id = SELECTEDVALUE( 'Table (2)'[id] )
If these work for you, pelase markas the solution.
I successfully created the columns using your codes. thank you again.
however, when i tried to create them as measures, i am not getting the results I want (see bottom for screenshot).
And I changed the logic for exist_prior a little bit: as long as the id is not null, and the date is 1 day prior to the max date in the whole table.
can you please take a look at the syntax below to see where I get it wrong, and correct the measure?
measure syntax:
For the "if" statement, I thought it goes through the table row by row and test the statement, which is true in "column", but that is not the case in measure i guess. I do understand that the measure is doing a aggregation, but how do i get it to examine just 1 row with the variable given.
Here is what i get for the "exist_prior" with measure (not correct) and column (correct) in a table visual:
@zenz - If you want these as calculated columns, please use the below DAX:
exist_prior =
VAR _id = 'Table (2)'[id]
VAR date_prior = 'Table (2)'[date] + 1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior , 'Table (2)'[id] = _id)
RETURN
if( ISBLANK(id_prior),0,1)
-------------------
exist_new =
VAR _id = 'Table (2)'[id]
VAR date_prior = 'Table (2)'[date] -1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id )
VAR min_date = CALCULATE( min( 'Table (2)'[date] ), REMOVEFILTERS( 'Table (2)' ))
RETURN
if( ISBLANK( id_prior ),if('Table (2)'[date] = min_date,0,1),0)
-------------------
Transfer In =
VAR _id = 'Table (2)'[id]
VAR _bu = 'Table (2)'[bu]
VAR date_prior = 'Table (2)'[date] +1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id, 'Table (2)'[bu] <> _bu )
RETURN
if( ISBLANK( id_prior ),0,1)
--------------------
Transfer Out =
VAR _id = 'Table (2)'[id]
VAR _bu = 'Table (2)'[bu]
VAR date_prior = 'Table (2)'[date] -1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id, 'Table (2)'[bu] <> _bu )
RETURN
if( ISBLANK( id_prior ),0,-1)
---------------------
VAR _id = 'Table (2)'[id]
VAR _type = 'Table (2)'[type]
VAR date_prior = 'Table (2)'[date] -1
VAR id_prior = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior, 'Table (2)'[id] = _id, 'Table (2)'[type] <> _type )
VAR date_future = 'Table (2)'[date] + 1
VAR id_future = CALCULATE(MAX( 'Table (2)'[id] ), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_future, 'Table (2)'[id] = _id, 'Table (2)'[type] <> _type )
RETURN
SWITCH( TRUE() , id_prior = 'Table (2)'[id], 1, id_future = 'Table (2)'[id], -1 ,0 )
-------------------------
Removed =
VAR _id = 'Table (2)'[id]
VAR date_prior = 'Table (2)'[date] +1
VAR id_prior = CALCULATETABLE(VALUES('Table (2)'[id]), REMOVEFILTERS( 'Table (2)' ), 'Table (2)'[date] = date_prior , 'Table (2)'[id] = _id)
VAR id_in_prior = CALCULATE( MAX( 'Table (2)'[id] ), not('Table (2)'[id]) in { id_prior })
VAR max_date = CALCULATE( MAX( 'Table (2)'[date] ), REMOVEFILTERS( 'Table (2)' ))
RETURN
if( ISBLANK( id_in_prior ), 0,if('Table (2)'[date] = max_date, 0,-1 ))
-------------------------
Ending =
VAR max_date = CALCULATE( MAX( 'Table (2)'[date] ), REMOVEFILTERS( 'Table (2)' ))
RETURN
if( 'Table (2)'[date] = max_date, 1,0 )
Screen shot shows they work as requested:
If you would like to make them measures, you just need to bt every 'Table'[Column]' reference in a filter or VAR inside SELECTEDVALUE - e.g. VAR _id = SELECTEDVALUE( 'Table (2)'[id] )
If these work for you, pelase markas the solution.
If you have recently started exploring Fabric, we'd love to hear how it's going. Your feedback can help with product improvements.
A new Power BI DataViz World Championship is coming this June! Don't miss out on submitting your entry.
Share feedback directly with Fabric product managers, participate in targeted research studies and influence the Fabric roadmap.
| User | Count |
|---|---|
| 8 | |
| 8 | |
| 3 | |
| 2 | |
| 2 |
| User | Count |
|---|---|
| 23 | |
| 13 | |
| 10 | |
| 6 | |
| 5 |