PowerBI实用技巧——案例八(RANKX 排序技巧(主次规则排序))

今天分享一波在使用排序功能时的小技巧。类似的方法其实有很多种,这边我拎出来一个最容易上手理解的方法分享给大家。

问题解析:如何解决当首要排序列遇到相同值时,依次要排序列进行排序?(例如,当依销量排序时,遇到相同销量,而你想在销量相同时依展示的维度进行排序,怎么做?)

DEMO数据如下:

 

由上数据我们可以看出来NAME为C、D的销售值是相等的,当我们进行正常排序时RANK应该为如下效果: 

DAX:

 常规Rank = IF(HASONEVALUE('Table'[NAME]),RANKX(ALL('Table'[NAME]),[Salesvalue]))

如上图,可以看到C和D都排名第一,此时我想当销售额相等时,NAME排在前面的则为第一名,其次第二名,以此类推。。。

       这个时候我们就需要添加一个次排序列,我们为NAME列进行一个MAX取值变换为度量值,对NAME度量值进行RANK排序,通过原有的常规RANK+次排序列实现我们想要的效果,效果如下:

DAX:RANK VALUES = RANKX(ALL('Table'[NAME]),[Salesvalue])+RANKX(ALL('Table'[NAME]),[MAXNAME])-1

           主次排序Rank = IF(HASONEVALUE('Table'[NAME]),RANKX(ALL('Table'[NAME]),[RANK VALUES],,ASC))

备注:刚开始学习RANK函数的小伙伴可能会一直出来RANK为都为1的情况。第一 <表>没有使用ALL或者ALLSELECTED函数去排除行上下文和筛选上下文,导致排序受到上下文的影响。第二 表达式没有使用提前聚合好的度量值,而直接使用类似SUM(xxx)这样的聚合函数

此文章参考https://zhuanlan.zhihu.com/p/101377339进行理解实践简写,如理解实践方面有问题,欢迎留言记录。

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Comparator接口来实现主次条件排序。Comparator接口定义了一个比较器方法compare,通过比较方法返回值的正负来实现排序。下面是一个示例代码: ```java import java.util.*; class Student { private String name; private int age; private double score; public Student(String name, int age, double score) { this.name = name; this.age = age; this.score = score; } public String getName() { return name; } public int getAge() { return age; } public double getScore() { return score; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", score=" + score + '}'; } } public class Main { public static void main(String[] args) { List<Student> students = new ArrayList<>(); students.add(new Student("Tom", 18, 90)); students.add(new Student("Jerry", 19, 88)); students.add(new Student("Alice", 20, 92)); // 按照分数从高到低排序,分数相同按照年龄从小到大排序 Collections.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { if (o1.getScore() != o2.getScore()) { return (int) (o2.getScore() - o1.getScore()); } return o1.getAge() - o2.getAge(); } }); for (Student student : students) { System.out.println(student); } } } ``` 运行结果: ``` Student{name='Alice', age=20, score=92.0} Student{name='Tom', age=18, score=90.0} Student{name='Jerry', age=19, score=88.0} ``` 在上面的示例中,我们定义了一个Student类,并实现了按照分数从高到低排序,分数相同按照年龄从小到大排序规则。我们使用了Comparator接口,并通过匿名内部类的方式来实现compare方法。最后,使用Collections.sort方法对List进行排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值