多个字段排序_PowerBI不能按多字段排序?这个方法推荐给你

53b5429da4753ec8f176c92de3952795.png

​目前PowerBI不支持按多个字段排序,虽然这个需求很普遍,这里利用DAX提供一个变通的实现方式。

模拟数据如下,有两个数据指标:

4762b9fe03db8d9b158a876a0614aa81.png

对类别首先按[指标一]进行排序,如果[指标一]数据相同,则按[指标二]排序。

因为PowerBI目前只能按一列排序,自然会想到构造个辅助列来实现,比如这样来添加辅助列:

ff9ac88ab66db641f56f3673144e61b5.png

原理就是在主排序列上加上一个特别小的数,这个特别小的数是由次排序列生成,两个数据加到一起,就生成了一个由两个指标混合而成,并且不会损坏原数据大小顺序的列,然后按这个辅助列计算排名就可以了。

d6fe32cdf5f71aa18203207aa5b184c9.png

这个排序就是按照指标一和指标二作为主次排序字段生成。

该方法的关键就是确定如何生成这个辅助列,因为上面的数据一目了然,随便用[指标二]除以一个很大的数,就可以生成一个不改变指标二顺序的序列,并且加上这个序列以后,不会影响到[指标一]的总体顺序。

但是如果数据量很大,并且数据大小跨度也很大,你就不能轻易的决定是除以10000、还是除以1000000更合适,必须先清楚的了解排序指标的数据结构,才能保证排序正确。

这里给出一个更加普适的方式来构造这个辅助列,无需考虑排序列的绝对数据大小,而改用相对大小,用它们自身的排名来构造,如下图:

0b34c33aa4207216a9df05799ba7ec25.png

也就是[指标一]的升序排名,加上,[指标二]的升序排名除以(行数+1),原理是类似的,然后按这个辅助列排序就可以了。

当然,也可以不加物理辅助列,而把这个逻辑放到公式内部,一次性生成按两个指标的排名:

ff8c2ff008303e8a69a1de1da6fd9811.png

这里用了三个RANKX,你可以慢慢琢磨一下这个公式的逻辑,同时加深对这个函数的理解。

度量值的方式同样可以实现,用这几个字段生成矩阵,并把排名度量值放进去,效果如下:

d700d272bae2ccf34a36b8a692eff681.png

本文示例是按两个字段排序,如果是两个以上,同样是这样的原理和逻辑,需要的时候,直接套用就可以了。


-精彩推荐-

PowerBI数据分析实践:趋势分析法的应用

PowerBI这个图表太强大,做预算分析少不了它:ValQ

Power BI中灵活计算分类数据的DAX函数:ALLEXCEPT

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中按两个字段排序可以使用Comparator接口来实现。Comparator接口提供了compare()方法来比较两个对象的大小,并且可以用于排序操作。 下面是一个按两个字段排序的示例代码: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class PersonComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { // 先按照name排序 int nameCompare = p1.getName().compareTo(p2.getName()); if (nameCompare != 0) { return nameCompare; } // 如果name相同,按照age排序 return Integer.compare(p1.getAge(), p2.getAge()); } } public class Main { public static void main(String[] args) { List<Person> people = new ArrayList<>(); people.add(new Person("Alice", 25)); people.add(new Person("Bob", 30)); people.add(new Person("Alice", 20)); people.add(new Person("Bob", 25)); Collections.sort(people, new PersonComparator()); for (Person p : people) { System.out.println(p.getName() + " " + p.getAge()); } } } ``` 输出结果: ``` Alice 20 Alice 25 Bob 25 Bob 30 ``` 在上面的示例代码中,我们定义了一个Person类,里面包含了name和age两个字段。然后我们定义了一个PersonComparator类,实现了Comparator接口,并重写了compare()方法。在compare()方法中,我们先按照name进行比较,如果name相同,再按照age进行比较。最后,我们在main()方法中使用Collections.sort()方法对people列表进行排序,并传入PersonComparator对象作为比较器。最后输出排序后的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值