Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

sum top values with rankx without duplicates

I've been searching for a solution to my problem but I can't find it :

I want to get the average of the first top 10 total measure.  

 

I created a rank measure first but I get duplicates rank values :

 

rank total = RANKX(ALL(Table[name]),[total],,DESC,Dense)

 

 

I've tried also TOPN function but I get wrong values because of the duplicates values.

 

Here's an a sample of first 10 rows :

nametotalrank totaldesired rank totalDesired output
a96%1190.6%
b95%2290.6%
c94%3390.6%
d92%4490.6%
e91%5590.6%
f91%5690.6%
g90%7790.6%
h87%8890.6%
i85%9990.6%
j85%91090.6%

 

The desired output is :

 

Top 10 = 90.6 %

 

 

Thanks.

  • Anonymous  you can achieve the end goal with following two measueres

    Ranking = 
    VAR _1 =
        RANKX (
            ALL ( 'Table'[name] ),
            CALCULATE ( MAX ( 'Table'[total] ) )
                + DIVIDE ( CALCULATE ( UNICODE ( MAX ( 'Table'[name] ) ) ), 1000000 ),
            ,
            DESC
        )
    RETURN
        IF ( _1 < 11, _1 )
    
    Top10Average = 
    VAR _1 =
        CALCULATE (
            AVERAGEX (
                FILTER (
                    ADDCOLUMNS (
                        'Table',
                        "X",
                            RANKX (
                                ALL ( 'Table' ),
                                CALCULATE ( MAX ( 'Table'[total] ) )
                                    + DIVIDE ( CALCULATE ( UNICODE ( MAX ( 'Table'[name] ) ) ), 1000000 ),
                                ,
                                DESC
                            )
                    ),
                    [X] < 11
                ),
                [total]
            ),
            ALL ( 'Table'[name] )
        )
    RETURN
        IF ( [Ranking] <> BLANK (), _1 )

    pbix is attached

     

     

     

     

     

  • Hi,

    Please check the below picture and the attached pbix file.

    I added one more condition to calculate the ranking, that is the alphabet order.

    I multiply it by 0.001. And then add to the [Total]. -> This is what I used as an expression inside the Ranking function and TOPN function.

     

     

    Total: =
    IF ( HASONEVALUE ( 'Table'[name] ), SUM ( 'Table'[total] ) )
     
    Desired rank: =
    IF (
    HASONEVALUE ( 'Table'[name] ),
    RANKX (
    ALL ( 'Table' ),
    [Total:]
    + 0.001
    * CALCULATE (
    RANKX ( ALL ( 'Table' ), CALCULATE ( MAX ( 'Table'[name] ) ),, DESC )
    ),
    ,
    DESC
    )
    )
     
    Desired output: =
    VAR top10table =
    TOPN (
    10,
    ALL ( 'Table' ),
    [Total:]
    + 0.001
    * CALCULATE (
    RANKX ( ALL ( 'Table' ), CALCULATE ( MAX ( 'Table'[name] ) ),, DESC )
    ), DESC
    )
    RETURN
    IF ( HASONEVALUE ( 'Table'[name] ), AVERAGEX ( top10table, [Total:] ) )
     

     

6 Replies

  • Anonymous ,
    Assume this a measure - total, create a new measures

     

    total 1 = [total] +rand()

    and


    calculate([total],TOPN(10,allselected(table[name]),s[total 1],DESC))

    • Anonymous's avatar
      Anonymous
      Not applicable

      thanks amitchandak , I've tested your code but unfortunately didn't work correctly for different examples. You can check smpa01 and Jihwan_Kim answers

  • smpa01's avatar
    smpa01
    Icon for Community Champion rankCommunity Champion

    Anonymous  you can achieve the end goal with following two measueres

    Ranking = 
    VAR _1 =
        RANKX (
            ALL ( 'Table'[name] ),
            CALCULATE ( MAX ( 'Table'[total] ) )
                + DIVIDE ( CALCULATE ( UNICODE ( MAX ( 'Table'[name] ) ) ), 1000000 ),
            ,
            DESC
        )
    RETURN
        IF ( _1 < 11, _1 )
    
    Top10Average = 
    VAR _1 =
        CALCULATE (
            AVERAGEX (
                FILTER (
                    ADDCOLUMNS (
                        'Table',
                        "X",
                            RANKX (
                                ALL ( 'Table' ),
                                CALCULATE ( MAX ( 'Table'[total] ) )
                                    + DIVIDE ( CALCULATE ( UNICODE ( MAX ( 'Table'[name] ) ) ), 1000000 ),
                                ,
                                DESC
                            )
                    ),
                    [X] < 11
                ),
                [total]
            ),
            ALL ( 'Table'[name] )
        )
    RETURN
        IF ( [Ranking] <> BLANK (), _1 )

    pbix is attached

     

     

     

     

     

    • Anonymous's avatar
      Anonymous
      Not applicable

      Thanks smpa01 , worked like a charm 🙂

  • Hi,

    Please check the below picture and the attached pbix file.

    I added one more condition to calculate the ranking, that is the alphabet order.

    I multiply it by 0.001. And then add to the [Total]. -> This is what I used as an expression inside the Ranking function and TOPN function.

     

     

    Total: =
    IF ( HASONEVALUE ( 'Table'[name] ), SUM ( 'Table'[total] ) )
     
    Desired rank: =
    IF (
    HASONEVALUE ( 'Table'[name] ),
    RANKX (
    ALL ( 'Table' ),
    [Total:]
    + 0.001
    * CALCULATE (
    RANKX ( ALL ( 'Table' ), CALCULATE ( MAX ( 'Table'[name] ) ),, DESC )
    ),
    ,
    DESC
    )
    )
     
    Desired output: =
    VAR top10table =
    TOPN (
    10,
    ALL ( 'Table' ),
    [Total:]
    + 0.001
    * CALCULATE (
    RANKX ( ALL ( 'Table' ), CALCULATE ( MAX ( 'Table'[name] ) ),, DESC )
    ), DESC
    )
    RETURN
    IF ( HASONEVALUE ( 'Table'[name] ), AVERAGEX ( top10table, [Total:] ) )