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

Don't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.

Reply
zenz
Frequent Visitor

Record exists in previous date and flag accordingly

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 :

idbutypedate
20810red6/18/2024
20910red6/18/2024
21010red6/18/2024
21110red6/18/2024
20910red6/19/2024
21020red6/19/2024
21110blue6/19/2024
21210red6/19/2024

 

 

Here is the final table wanted: 

 

idbutypedateexist_priorexist_newtransfer_intransfer_outconvertedremovedending
20810red6/18/202410000-10
20910red6/18/20241000000
21010red6/18/2024100-1000
21110red6/18/20241000-100
20910red6/19/20240000001
21020red6/19/20240010001
21110blue6/19/20240000101
21210red6/19/20240100001

 

id - whole number 

bu - whole number

type - text

date - date

 

the 7 new columns / measures wanted are defined as follows: 

  • exist_prior = if the 'id' exists in the previous date (6/18), then put 1 in the line of the 6/18, and put 0 in the line of the 6/19
    • examples: id in 208, 209, 210, and 211
  • exist_new = if the 'id' only exists in the latest date (6/19), then put 0 in 6/18, and put 1 in 6/19
    • example: eid = 212
  • transfer_in = if 'id' exists in both dates and bu changed, put 0 in 6/18, and put 1 in 6/19
    • example: id = 210
  • transfer_out = if 'id' exists in both dates and bu changed, put -1 in 6/18, and put 0 in 6/19
    • example: id = 210
  • converted = if 'id' exists in both dates and type changed, put -1 in 6/18, and put 1 in 6/19
    • example: id = 211
  • removed = if 'id' exists in only previous date, put -1 in 6/18.
    • example: id = 208
  • ending = 1 for latest date (6/19), and 0 for previous date (6/18)
    • examples: id in 209, 210, 211 and 212

Thank you so much for your advice and help! 

 

 

 

 

 

1 ACCEPTED SOLUTION
mark_endicott
Super User
Super User

@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:

mark_endicott_0-1718974911599.png

 

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. 

View solution in original post

3 REPLIES 3
zenz
Frequent Visitor

@mark_endicott , 

 

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: 

measure_exist_prior =
VAR date_prior = MAX('test'[date]) - 1
RETURN  
    if(        
        NOT(ISBLANK( SELECTEDVALUE(test[id] ) ) ) && SELECTEDVALUE( test[date] ) = date_prior, 1,0
    )
 
 
column syntax: 
column_exist_prior =
VAR date_prior = MAX('test'[date]) - 1
RETURN  
    if(        
        NOT(ISBLANK( 'test'[id]) ) &&  'test'[date] = date_prior, 1,0
    )
 
 

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_1-1719441982304.png

 

zenz
Frequent Visitor

@mark_endicott Thank you so much! 

mark_endicott
Super User
Super User

@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:

mark_endicott_0-1718974911599.png

 

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. 

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.

Jan25PBI_Carousel

Power BI Monthly Update - January 2025

Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.

Jan NL Carousel

Fabric Community Update - January 2025

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