Check your eligibility for this 50% exam voucher offer and join us for free live learning sessions to get prepared for Exam DP-700.
Get StartedDon'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.
I need to identify recorders that have been changed so that they can be flagged, something like below the table.
the data come from a table containing rolling 90 days record
Date | Ref | Status | Status changed |
1/02/2017 | 1 | A | 0 |
2/02/2017 | 1 | A | 0 |
3/02/2017 | 1 | B | 1 |
1/02/2017 | 2 | A | 0 |
2/02/2017 | 2 | V | 1 |
3/02/2017 | 2 | A | 1 |
Solved! Go to Solution.
Hi @Sir_night,
It's obviously there is an order of "Date" for a "Ref" in your scenario. So let's sort the data first, then add an index to keep the orders. Finally, we just need to compare "Status" between "index" and "index + 1".
1. Open "Query Editor", do "Sort Ascending" of "Ref", then do "Sort Ascending" of "Date". There will be two arrows. (blue rectangle). Please don't break the order of ordering. "Ref" first, "Date" second.
2. Add an index.
3. Add a calculated column.
Status changed = VAR NextStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) - 1 ) ) RETURN IF ( ISBLANK ( NextStatus ), 0, IF ( 'Table1'[Status] = NextStatus, 0, 1 ) )
Best Regards!
Dale
Hi David,
It would be a little complicated.
Method 1: Add a new column, tag the previous record only. (depend on [Status changed])
Status changed = VAR NextStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) - 1 ) ) RETURN IF ( ISBLANK ( NextStatus ), 0, IF ( 'Table1'[Status] = NextStatus, 0, 1 ) )
Method 2: there are four statuses here. (independant)
0 isn't changed and isn't previous
1 changed and isn't previous
2 isn't changed and previous
3 changed and previous
StatusFlag = VAR LastStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) - 1 ) ) VAR NextStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) + 1 ) ) RETURN IF ( ISBLANK ( LastStatus ) && 'Table1'[Status] = NextStatus, 0, IF ( ISBLANK ( LastStatus ) && 'Table1'[Status] <> NextStatus, 2, IF ( ISBLANK ( NextStatus ) && 'Table1'[Status] = lastStatus, 0, IF ( ISBLANK ( NextStatus ) && 'Table1'[Status] <> lastStatus, 1, IF ( 'Table1'[Status] = NextStatus && 'Table1'[Status] = lastStatus, 0, IF ( 'Table1'[Status] = lastStatus && 'Table1'[Status] <> NextStatus, 2, IF ( 'Table1'[Status] <> lastStatus && 'Table1'[Status] <> NextStatus, 3 ) ) ) ) ) ) )
Best Regards!
Dale
Hi @Sir_night,
It's obviously there is an order of "Date" for a "Ref" in your scenario. So let's sort the data first, then add an index to keep the orders. Finally, we just need to compare "Status" between "index" and "index + 1".
1. Open "Query Editor", do "Sort Ascending" of "Ref", then do "Sort Ascending" of "Date". There will be two arrows. (blue rectangle). Please don't break the order of ordering. "Ref" first, "Date" second.
2. Add an index.
3. Add a calculated column.
Status changed = VAR NextStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) - 1 ) ) RETURN IF ( ISBLANK ( NextStatus ), 0, IF ( 'Table1'[Status] = NextStatus, 0, 1 ) )
Best Regards!
Dale
Hi Dale
is there any way to modify this to mark both the changed record and the prevouse record
thanks for your help
David
Hi David,
It would be a little complicated.
Method 1: Add a new column, tag the previous record only. (depend on [Status changed])
Status changed = VAR NextStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) - 1 ) ) RETURN IF ( ISBLANK ( NextStatus ), 0, IF ( 'Table1'[Status] = NextStatus, 0, 1 ) )
Method 2: there are four statuses here. (independant)
0 isn't changed and isn't previous
1 changed and isn't previous
2 isn't changed and previous
3 changed and previous
StatusFlag = VAR LastStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) - 1 ) ) VAR NextStatus = CALCULATE ( VALUES ( Table1[Status] ), FILTER ( ALL ( 'Table1' ), 'Table1'[Ref] = EARLIER ( Table1[Ref] ) && 'Table1'[Index] = EARLIER ( Table1[Index] ) + 1 ) ) RETURN IF ( ISBLANK ( LastStatus ) && 'Table1'[Status] = NextStatus, 0, IF ( ISBLANK ( LastStatus ) && 'Table1'[Status] <> NextStatus, 2, IF ( ISBLANK ( NextStatus ) && 'Table1'[Status] = lastStatus, 0, IF ( ISBLANK ( NextStatus ) && 'Table1'[Status] <> lastStatus, 1, IF ( 'Table1'[Status] = NextStatus && 'Table1'[Status] = lastStatus, 0, IF ( 'Table1'[Status] = lastStatus && 'Table1'[Status] <> NextStatus, 2, IF ( 'Table1'[Status] <> lastStatus && 'Table1'[Status] <> NextStatus, 3 ) ) ) ) ) ) )
Best Regards!
Dale
@Sir_night do you have a status change date, to be honest that would be your best bet is have some sort of indicator when its changed.
Power bi is not really a database, its a data visualisation tool, so doing this sort of thing is better done at source or with the right data coming into the model.
In a real world scenario you would need to snapshot the data in order to compare old to new.
Proud to be a Super User!
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.
Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.
User | Count |
---|---|
143 | |
85 | |
66 | |
51 | |
45 |
User | Count |
---|---|
216 | |
89 | |
82 | |
66 | |
57 |