Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
5 years ago
Solved

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
NamesCounts
XXX1
YYY2
ZZZ3
AAA4
AAA2
BBB3
BBB2
CCC0
CCC1
DDD2
FFF1


I Created a Measure column 'Total Counts' by grouping 'Names' column & created Rank based on 'Total count'

NamesTotal countsRank
AAA61
BBB52
ZZZ33
DDD24
YYY24
CCC15
FFF15
XXX15

 


My exepected Output:
I need to create a Index column based on the Rank column as shown in the below table using DAX:

NamesTotal countsRankIndex
AAA611
BBB522
ZZZ333
DDD244
YYY245
CCC156
FFF157
XXX158




  • 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
        )

     

     

  • 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.
        )

     

5 Replies

  • 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
        )

     

     

    • Anonymous's avatar
      Anonymous
      Not applicable

      Thank you so much..
      Can you please explain on th functions used in...
      It would really helps..

      • jennratten's avatar
        jennratten
        Super 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.
            )