Power BI中如何基于切片器在可视化对象内实现动物按浏览量排名
Power BI 切片器筛选后按浏览量排名的度量值解决方案
原始数据
Answers 表数据如下:
| Animal | Viewed |
|---|---|
| Cat | 17 |
| Chicken | 12 |
| Cow | 7 |
| Dog | 28 |
| Goat | 36 |
需求
设置 Animal 切片器后,在可视化对象中对筛选出的动物按 Viewed(浏览量)进行排名,需创建对应的度量值。
预期结果
当切片器选中 Chicken、Cow、Dog 时,排名结果如下:
| Animal | Viewed | RANK |
|---|---|---|
| Chicken | 12 | 2 |
| Cow | 7 | 3 |
| Dog | 28 | 1 |
失败的尝试
尝试1:使用RANK Dense函数未生效
Rank_fkt = RANKX(ALL(Answers),CALCULATE(MAX(Answers[Viewed])),,DESC,Dense)
返回结果:
| Animal | Viewed | Rank_fkt |
|---|---|---|
| Chicken | 12 | 4 |
| Cow | 7 | 5 |
| Dog | 28 | 2 |
问题:ALL(Answers) 忽略切片器筛选,计算所有动物的全局排名,而非仅筛选后的范围。
尝试2:使用RANK ALLSELECTED函数未生效
Rank_ALL = rankx(ALLSELECTED(Answers[Animal]),CALCULATE(MAX(Answers[Viewed])))
返回结果:
| Animal | Viewed | Rank_ALL |
|---|---|---|
| Chicken | 12 | 1 |
| Cow | 7 | 1 |
| Dog | 28 | 1 |
问题:行上下文已筛选单个动物,CALCULATE(MAX(Answers[Viewed])) 仅返回当前行的浏览量,导致每个动物都和自身比较,排名均为1。
尝试3:结合RANK与Selectedvalue的尝试失败
RANK_sel = VAR SelectedAnimal = SELECTEDVALUE(Answers[Animal]) RETURN RANKX( ALL('Answers'), CALCULATE(SUM('Answers'[Viewed]), Answers[Animal] = SelectedAnimal),,DESC,Dense )
返回结果:
| Animal | Viewed | Rank_fkt |
|---|---|---|
| Chicken | 12 | 1 |
| Cow | 7 | 1 |
| Dog | 28 | 1 |
问题:SelectedAnimal 在可视化行上下文里是当前行的动物,迭代时每一行仅计算自身的浏览量,所有行排名均为1。
正确的度量值
使用以下DAX表达式创建度量值:
Animal Rank = RANKX( ALLSELECTED(Answers[Animal]), CALCULATE(MAX(Answers[Viewed])), , DESC, DENSE )
原理说明
ALLSELECTED(Answers[Animal]):限定排名范围为切片器筛选后的所有动物,确保仅在选中集合内计算排名。CALCULATE(MAX(Answers[Viewed])):迭代每个选中的动物时,自动切换上下文获取对应动物的浏览量。DESC:按浏览量降序排名,数值越大排名越靠前。DENSE:采用紧密排名规则,相同浏览量对应相同排名,后续排名不跳跃。
内容的提问来源于stack exchange,提问作者Johnny Spindler
相关产品推荐
相关产品推荐

