说明:如何通过index或者rank实现多级别筛选,同时结合在第二级别建立TOP规则。
以Tableau超市数据为例,希望按照省份、城市排序,显示销售额;同时能只看每个城市的TOP5.
1、为什么默认的排序容易出错?官方的排序逻辑是什么?
我们拖入省字段和城市字段,按照城市降序排列,可能会出现如下的排序错乱。
为什么?仔细看一下发现,只有城市右侧有降序标记,而“省/自治区”旁边没有;同时,洛阳实际上是属于多个省份的,它的销售数据同时出现在了多个省份中。河南洛阳103089+广东洛阳61715=164804,刚刚属于下图的第三名(当然,洛阳也可能出现在更多的省份中)。
也就是说,Tableau的默认排序是基于全局的排序,基于单个字段的排序,在这个案例中,相当于是 基于城市的维度之后,按照{exclude [省/自治区]:sum[销售额]}计算总额后排序的。
2、【方案1】如何根据需要修正官方的排序逻辑?——rank排序函数
既然官方的排序是是基于全局,基于单个字段的,而不是先省,再城市的逻辑,我们就要另外建立一套排序的字段,从视图的维度,而不是全局的维度建立排序规则。
- 创建基于视图的计算字段,计算省内的城市销售,排除全局影响;
- 基于上述字段或者使用rank排序函数降序排列。
在上面的案例的,我们创建了一个rank函数,RANK(SUM([销售额]),'desc') ,拖入到视图中,这个是受当前视图约束的,不是全局的,因此会按照各省份的城市销售给予rank排名,而desc代表降序。
rank(expression, asc/desc)
表示返回分区中当前行按照聚合表达式expression的竞争排名
计算字段的计算依据:城市。把index放在城市(维度)之前,建立index与维度字段的索引关联,必要时清除省/自治区、城市上的排序规则,然后在点击工具栏的降序。
3、如何显示TOP?
在Tableau的操作顺序中,条件和TOP顶部筛选的优先级高于维度筛选器,所以使用TOP建立集合,再拖入到二级分类中是不行的,TOP10只会引用全局的TOP10,而不是二级分类后的TOP10,所以出现下面的问题:我想要各省下的TOP10城市,结果系统给我的是全部省份的TOP10.
如何修正呢?
我想可以通过上下文筛选器+集合实现,因为上下文筛选器高于集合,但是没有实验成功,有兴趣的可以按照这个逻辑试一下。
最后,我继续使用了上面的rank函数返回值,拖入到筛选器,或者先新建字段再拖入筛选器,选择需要的TOP数量,比如5.不足之处是不能使用参数。
4、使用index实现排序——关于index的位置
index()表示返回分区中当前行的索引,不包含与值有关的任何排序。
- index的索引,与放置的位置有关系,与数值没有关系。当放在城市(维度)最后面,index的索引是变动的,不与任何值有关;当放在城市(维度)前面时,index的索引与城市关联,并随着排序的变化而变化;(可以参考下面的动图)
- 当index放在维度最后时,索引与数值无关;因此默认的排序还是基于全局的,不能实现我们想要的基于二级数值排序;因此要放在维度之前,这时的索引与维度关联,并随着维度字段而变化。(图)
5、几个注意事项:
- index函数部分情况下和rank类似,建立排序可以使用,二者区别在于,index是建立维度的索引,与数值无关,而rank是基于expression聚合表达式建立排名;
- 不管是rank还是index,建议放在你要排序的字段前面;如果不想显示,可以“隐藏标题”。
1 Sep 2018 rank
2 Sep 2018 增加 index
补充 3 Oct 2018
使用index做公共基准的变化趋势
在官方博客中,有一个查看三部电影自上线后每周的票房收入案例,需要先通过index()在日期的序列上建立索引,然后把这个索引加入到列字段,再通过颜色显示电影名称。视图是这样的。
我刚开始不明白它的逻辑,后来发现可以通过交叉表,更好的发现逻辑。邮件工作表,复制交叉表。你会发现,Tableau通过index创建了一个基于days的索引,然后把它作为连续数值生成轴。
用这个功能,我们可以对比多个新品上线后的表现。