PowerBI使用RANKX按歌曲得票数排名全部显示第1如何解决
问题根因
RANKX的执行逻辑为:先迭代第一个参数指定的表范围,对每一行计算第二个参数的表达式值生成排序值列表,再将当前筛选上下文下计算的第二个参数值与列表对比得到排名。
你原写法的问题在于:第二个参数MAX(songs[votes])在迭代ALL(songs)的每一行时,无法继承迭代的行上下文,迭代范围内所有行返回的值都等于当前可视化行对应歌曲的票数,排序值列表内所有值相等,因此所有歌曲的排名均为1。
解决方法
1. 先创建基础得票度量值(推荐)
统一封装票数统计逻辑,避免重复编写聚合函数,适配更多筛选场景:
total_votes = SUM(songs[votes])
如果你的songs表每行对应唯一歌曲,也可以替换为MAX(songs[votes])。
2. 修正RANKX度量值写法
根据你的业务需求选择对应写法:
- 固定全库排名:不受页面其他歌曲筛选器影响,所有歌曲全局排名
songs_ranking = RANKX(ALL(songs[title]), [total_votes],, DESC, SKIP)
这里第一个参数仅指定清除songs[title]字段的筛选,比直接传入ALL(songs)性能更优,也不会干扰其他字段的筛选逻辑。
- 动态范围排名:排名范围随页面筛选器同步变化(例如筛选特定歌手后,仅在该歌手的歌曲范围内排名)
songs_ranking = RANKX(ALLSELECTED(songs[title]), [total_votes],, DESC, SKIP)
可选参数调整
- 第四个参数填
DESC表示按票数从高到低排序,票数越高排名越靠前,填ASC则为从低到高排序 - 第五个参数填
SKIP表示同票时跳过后续名次(例:2个第1名,下一名为第3名),填DENSE表示同票时保留连续排名(例:2个第1名,下一名为第2名)
内容的提问来源于stack exchange,提问作者Javier Blanco
相关产品推荐
相关产品推荐

