Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
daxesh
Helper I
Helper I

Rankings using DAX

Hello ,

My Data and implementation:

Schoolid           No. of Student           StudentGroup
---------------------------------------------------------
S1                            10                                  0-10
S2                             11                                11-20
S3                             20                                11-20
S4                             21                                21-30
S4                             35                                31-40

(Higher the count, top on rankings)

 

Now 'StudentGroup' stands for , group of student classified on number of students as below


-Row level security is implemented on the Schoolid , Let's say School with user Schoolid = S1 will able to see data only for school with id=S1

What i require?

 

What i want to find is rank of schools on the basis of No. of Student within the 'StudentGroup' in which particular School is falling in (refer above table).
"I wnat a rank of S2 as per No.of students within StudentGroup 11-20"

 

-I have created below DAX formula to get this value

 

RankMeasure:=MAXX(FILTER(ADDCOLUMNS(FILTER(Student,Student[StudentGroup] = "11-20"),"Rank",RANK.EQ(Student[No. of Student],Student[No. of Student])),Student[Schoolid] = "S2"),[Rank])

In the above formula what i am doing is :
1.Filtering Student on the basis of StudentGroup of selected Schoolid
2.Calculating ranking on the table return by first "FILTER"
3.Getting selected shool from the table return by second "FILTER"

 

But from msdn what i found is that , "ADDCOLUMNS" wont work with RANK.EQ.

 

I want to calculate ranking on the table which i am getting on the fly using FILTER.


Is there any other alternative to resolve above requirement. Please guide for the same.

 

Thanks

2 ACCEPTED SOLUTIONS
vinaypugalia
Resolver I
Resolver I

You take below approch to acheive your requirements.

 

You can prepare one more dimension table for School lets's say Student_RLS, Which will be the copy of table mentioned above

-There should be no relationship between copied table and original table , Import both the tables to power BI.

-Implement RLS , on copied table.

-Original table is independent of RLS implementation and All ranking calculations will be calculated on original table.

 

And your formula would be updated to below

RankMeasure:=MAXX(FILTER(ADDCOLUMNS(FILTER(Student,Student[StudentGroup] = "11-20"),"Rank",RANK.EQ(Student[No. of Student],Student[No. of Student])),Student[Schoolid] = VALUES(Student_RLS[Schoolid])),[Rank])

 

I am assuming , you are going to login with one school at a time to see report and your ranking measure as you have also mentioned that "Row level security is implemented on the Schoolid , Let's say School with user Schoolid = S1 will able to see data only for school with id=S1".

 

So your RLS will be implemented on Student_RLS[SchoolId].

 

Hope, this helps!

 

Thanks.

View solution in original post

Great!

your solution worked for me

Thanks @vinaypugalia

View solution in original post

3 REPLIES 3
vinaypugalia
Resolver I
Resolver I

You take below approch to acheive your requirements.

 

You can prepare one more dimension table for School lets's say Student_RLS, Which will be the copy of table mentioned above

-There should be no relationship between copied table and original table , Import both the tables to power BI.

-Implement RLS , on copied table.

-Original table is independent of RLS implementation and All ranking calculations will be calculated on original table.

 

And your formula would be updated to below

RankMeasure:=MAXX(FILTER(ADDCOLUMNS(FILTER(Student,Student[StudentGroup] = "11-20"),"Rank",RANK.EQ(Student[No. of Student],Student[No. of Student])),Student[Schoolid] = VALUES(Student_RLS[Schoolid])),[Rank])

 

I am assuming , you are going to login with one school at a time to see report and your ranking measure as you have also mentioned that "Row level security is implemented on the Schoolid , Let's say School with user Schoolid = S1 will able to see data only for school with id=S1".

 

So your RLS will be implemented on Student_RLS[SchoolId].

 

Hope, this helps!

 

Thanks.

Great!

your solution worked for me

Thanks @vinaypugalia

v-yulgu-msft
Employee
Employee

Hi @daxesh,

 

Based on my test, this measure returns correct rank value as expect.
RankMeasure:=MAXX(FILTER(ADDCOLUMNS(FILTER(Student,Student[StudentGroup] = "11-20"),"Rank",RANK.EQ(Student[No. of Student],Student[No. of Student])),Student[Schoolid] = "S2"),[Rank])
5.PNG

 

From msdn, it says "columnName cannot refer to any column created using these functions: ADDCOLUMNS, ROW or SUMMARIZE.I", this means the columNname you used in RANK.EQ cannot be the new column which is created by ADDCOLUMNS. That is to say, the columnName must be the column existing in source table. In your scenario, the [No. of Student] can be used in Rank.EQ while the added column [Rank] cannot be used.

 

If you still have any question, please feel free to ask.

 

Thanks,
Yuliana Gu

Community Support Team _ Yuliana Gu
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

Find out what's new and trending in the Fabric Community.