Forum Discussion
Rank Based on measures with row context.
- 9 years ago
mim, ImkeF, Anonymous - interesting problem.
Anonymous
I agree with your logic in the last post, and for Excel 2013 I would write the measure like this:
= IF ( HASONEVALUE ( MyTable[ID] ), RANKX ( FILTER ( ALL ( MyTable[ID] ), [TOSTR FORECAST DATE] = CALCULATE ( [TOSTR FORECAST DATE], VALUES ( MyTable[ID] ) ) ), MyTable[ID], VALUES ( MyTable[ID] ) ) )- Added a HASONEVALUE check to allow evaluation only for single IDs
- Within FILTER, the measure for the currently iterated ID is [TOSTR FORECAST DATE], and this is compared with the measure from the original filter context CALCULATE ( [TOSTR FORECAST DATE], VALUES ( MyTable[ID] ) ).
Putting VALUES ( MyTable[ID] ) as a filter argument effectively undoes the context transition. - Ranking is just based on ordering of IDs, descending by default. Can be tweaked.
Sample workbook here in case useful.
Cheers,
Owen :)
- Anonymous9 years ago
Wait, are you trying to tell me you actually understand the 3rd argument to RANKX? NOBODY DOES!! :D
Totally based on Owen's really good thinking, *I* would probably do this slightly differently to avoid the 3rd param:Rank of ID among those with same TOSTR FORECAST DATE 2:=IF (
HASONEVALUE ( MyTable[ID] ),
RANKX (
FILTER (
ALL ( MyTable[ID] ),
[TOSTR FORECAST DATE] = CALCULATE ( [TOSTR FORECAST DATE], VALUES ( MyTable[ID] ) )
),
CALCULATE( VALUES( MyTable[ID] ) )
)
)
Hi mim,
just to check understanding: You need the Rank as a measure, but the [TOSTR FORECAST DATE] is a column, so Rank per [TOSTR FORECAST DATE]-day?
Or is the date a measure as well?
yes TOSTR FORECAST DATE is a measure basically if there is one unique date then the rank will be 1, if the same date is repeated 5 times then the rank should 1,2,3,4,5 the order is not important
- Anonymous9 years agoNot applicable
Ignoring the difficulties in iterating over only rows that return the same measure value -- you have another problem. RankX can't return different ranks for the same value. I've only dealt with this by "cheating" -- and forcing tiny (almost random) variation in the value I am ranking.
At the highest level, we want:
= RANKX (
[[All Rows That We Want to Rank Against Each Other]],
[[measure value to rank, with some way of removing ties]]
)
The rows we want to rank against each other are... ALL rows that have the same measure value as the CURRENT row.
I'm gonna cheat and use variables, then hopefully we can figure out how to convert it ?
TheRank =
VAR MyDate = [MeasureThatGivesTheDate]
VAR MyRows = FILTER( ALL(MyTable[RowId]), [MeasureThatGivesTheDate] = MyDate )
RETURN RANKX(MyRows, CALCULATE ( MIN (MyTable[RowId] ) ) )
At least, that works in my head... (using RowId to force an arbitrary ranking of all the MyRows)- OwenAuger9 years ago
Super User
mim, ImkeF, Anonymous - interesting problem.
Anonymous
I agree with your logic in the last post, and for Excel 2013 I would write the measure like this:
= IF ( HASONEVALUE ( MyTable[ID] ), RANKX ( FILTER ( ALL ( MyTable[ID] ), [TOSTR FORECAST DATE] = CALCULATE ( [TOSTR FORECAST DATE], VALUES ( MyTable[ID] ) ) ), MyTable[ID], VALUES ( MyTable[ID] ) ) )- Added a HASONEVALUE check to allow evaluation only for single IDs
- Within FILTER, the measure for the currently iterated ID is [TOSTR FORECAST DATE], and this is compared with the measure from the original filter context CALCULATE ( [TOSTR FORECAST DATE], VALUES ( MyTable[ID] ) ).
Putting VALUES ( MyTable[ID] ) as a filter argument effectively undoes the context transition. - Ranking is just based on ordering of IDs, descending by default. Can be tweaked.
Sample workbook here in case useful.
Cheers,
Owen :)
- Anonymous9 years agoNot applicable
Wait, are you trying to tell me you actually understand the 3rd argument to RANKX? NOBODY DOES!! :D
Totally based on Owen's really good thinking, *I* would probably do this slightly differently to avoid the 3rd param:Rank of ID among those with same TOSTR FORECAST DATE 2:=IF (
HASONEVALUE ( MyTable[ID] ),
RANKX (
FILTER (
ALL ( MyTable[ID] ),
[TOSTR FORECAST DATE] = CALCULATE ( [TOSTR FORECAST DATE], VALUES ( MyTable[ID] ) )
),
CALCULATE( VALUES( MyTable[ID] ) )
)
)