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. )
jennratten
5 years agoSuper User
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.
)
JOSELUISMTZRMZ1
3 years agoHelper I
I don't know why I get all as 1 😪
I only replaced my table and column , right?
Any Idea?