Forum Discussion
Anonymous
5 years agoNot applicable
To create a DYNAMIC index column using DAX based on Rank column:
I wanted to created a DYNAMIC index column using DAX based on Rank column: My Table: Table Names Counts XXX 1 YYY 2 ZZZ 3 AAA 4 AAA 2 BBB 3 BBB 2 CCC 0 ...
- 5 years ago
This measure will produce the index needed based on the rank of the total counts, then breaking ties using the names sorted alphabetically.
Rank on Count and Name = VAR CountByName = [TotalCounts] VAR CurrentName = SELECTEDVALUE ( TableOfCounts[Names] ) RETURN IF ( NOT ISBLANK ( CurrentName ) && ( CountByName > 0 ), VAR AllSelectedNames = ALLSELECTED ( TableOfCounts[Names] ) VAR MaxNameRanked = CALCULATE ( COUNTROWS ( TableOfCounts ), REMOVEFILTERS () ) VAR LookupTable = ADDCOLUMNS ( AllSelectedNames, "@CountByName", [TotalCounts] * MaxNameRanked + RANKX ( AllSelectedNames, TableOfCounts[Names],, DESC, DENSE ) ) VAR LookupCurrentName = FILTER ( LookupTable, TableOfCounts[Names] = CurrentName ) VAR CurrentValue = MAXX ( LookupCurrentName, [@CountByName] ) VAR Ranking = RANKX ( LookupTable, [@CountByName], CurrentValue,, DENSE ) RETURN Ranking ) - 5 years ago
Sure thing! Here is the same script, but with comments added for explanation. Note, this page provides additional insight. https://www.sqlbi.com/articles/rankx-on-multiple-columns-with-dax-and-power-bi/
Rank on Count and Name = ------------------------------------------------------- -- Variables Applicable to the Entire Measure ------------------------------------------------------- VAR CountByName = [TotalCounts] -- TotalCounts measure VAR CurrentName = -- The name for the current iteration of the table. SELECTEDVALUE ( TableOfCounts[Names] ) RETURN IF ( NOT ISBLANK ( CurrentName ) -- Make sure the name is not blank && ( CountByName > 0 ), -- and the total count for the name is greater than 0. ------------------------------------------------------- -- Variables Applicable within the Row Context ------------------------------------------------------- VAR AllSelectedNames = -- Create a table of names. ALLSELECTED ( TableOfCounts[Names] ) VAR MaxNameRanked = -- Since the name indices are distinct CALCULATE ( -- the max index equals the # of table rows. COUNTROWS ( TableOfCounts ), REMOVEFILTERS () -- retrieve the max for the entire model ) -- result is a constant value that does not require a query to be computed VAR LookupTable = -- Temp table with all names ranked. ADDCOLUMNS ( -- Add a column AllSelectedNames, -- to this table. "@CountByName", -- New column name [TotalCounts] * MaxNameRanked - + RANKX ( -- Convert names into a number by computing the rank of the name. AllSelectedNames, TableOfCounts[Names], , DESC, DENSE -- Alpha DESC: later in the alphabet = better = lower integer ) ) VAR LookupCurrentName = -- Temp table for the current row context (Name). FILTER ( LookupTable, TableOfCounts[Names] = CurrentName ) VAR CurrentValue = -- Temp table for the current row context (CountByName). MAXX ( LookupCurrentName, [@CountByName] ) VAR Ranking = -- Calculate the rank. RANKX ( LookupTable, [@CountByName], CurrentValue, , DENSE ) RETURN Ranking -- Return the rank. )
Greg_Deckler
5 years agoCommunity Champion
Anonymous I invented this once. The Mythical DAX Index - Microsoft Power BI Community. If that doesn't get you there, let me know.