Tableau:表计算中的特定维度
在用Tableau画桑基图的时候涉及到很多计算字段的计算依据,这篇博客重点整理一下有关特定维度的问题。1 度量和表计算 Tableau中既有【度量】又有【表计算】。【度量】可以
这里还是会用SQL的窗口函数来说明。
以Tableau自带的【订单-超市】数据为例,下面来验证【特定维度】的作用。创建两个计算字段【fun】和【fun2】,其定义如下:
这两个计算字段中涉及到的聚合函数已经在其他博客中已经介绍过,这里不再赘述。
测试1
测试1.1
将【订单日期】和【类别】拖拽到【行】中,将【订单日期】字段聚合到“年"上,将计算字段【fun】和【fun2】拖拽到【列】中,同时将图形显示改为【文本表】,得到的结果如下图。
此时【fun】和【fun2】的默认计算依据如下(两个计算字段的计算依据相同所以只展示【fun】的计算依据,下同)。
为了方便说明【特定维度】的作用,这里会用MySQL中的窗口函数进行说明(可以参考:MySQL中的窗口函数)。假设存在如下一张表a,其表结构及表中内容如下:
那么,上述计算结果对应的SQL伪代码如下(【fun】用row_number()函数代替,【fun2】用sum()函数代替)。
select 订单日期年,类别,row_number()over(order by 订单日期年,类别) as fun,
sum(销售额)over(order by 订单日期年,类别) as fun2
from a
**Tips:**在表计算中使用了【特定维度】后,Tableau提供了两种字段排序方式。具体如下图:
- 先说“自定义排序”。这种排序方式非常清晰明了,可以自己设置排序字段、排序方法和排序方向。
- 再来说“特定维度”排序。使用这种排序方式时,纳入到【特定维度】中的字段即为排序字段,而每个字段的排序方向可以自己调整。但这里重点要说的不是如何调整字段的排序方向,而是每个字段的默认排序方式。在上述例子中,”订单日期年”和“类别”都是以其默认排序方式进行排序的。如何查看字段的默认排序方式?具体如下图:
可以发现,“类别”的默认排序方式为 按数据源顺序 升序排序。
测试1.2
将【fun】和【fun2】的计算依据改为【特定维度】下的【类别】,具体如下图。
此时,【fun】和【fun2】的计算结果如下:
此时其对应的SQL伪代码如下:
select 订单日期年,类别,row_number()over(partition by 订单日期年 order by 类别) as fun,
sum(销售额)over(partition by 订单日期年 order by 类别)as fun2
from a
测试1.3
将【fun】和【fun2】的计算依据改为【特定维度】下的【订单日期年】,具体如下:
此时【fun】和【fun2】的计算结果如下:
此时对应的SQL源码如下:
select 订单日期年,类别,row_number()over(partition by 类别 order by 订单日期年) as fun,
sum(销售额)over(partition by 类别 order by 订单日期年) as fun2
from a
测试2
这部分主要是测试【所在级别】及【重新启动间隔】的作用。将测试1.1中的【订单日期 年】复制到【筛选器】中,筛选出2015和2016年的数据(如果不进行筛选,数据量太多截图比较麻烦),如下图所示。
再将【细分】拖拽到【行】中,此时【fun】和【fun2】的计算结果如下图。
此时,【fun】和【fun2】的计算依据如下:
假设存在一个表b,其表结构及表内容如下图。
此时对应的SQL伪代码如下:
select 订单日期年,细分,类别,row_number()over(order by 订单日期年,细分,类别) as fun,
sum(销售额)over(order by 订单日期年,细分,类别) as fun2
from b
测试2.1
将上述【fun】和【fun1】的计算依据中【特定维度】中的【所在级别】改为“订单日期 年”,具体如下图。
此时【fun】和【fun1】的计算结果如下图:
此时对应的SQL伪代码如下:
select 订单日期年,类别,细分,row_number()over(partition by 细分,类别 order by 订单日期年) as fun,
sum(销售额)over(partition by 类别,细分 order by 订单日期年) as fun2
from b
当将【fun】和【fun1】的计算依据中的【所在级别】改为【细分】时,其计算结果如下:
此时对应的SQL伪代码如下:
select 订单日期年,细分,类别,row_number()over(partition by 类别 order by 订单日期年,细分) as fun,
sum(销售额)over(partition by 类别 order by 订单日期年,细分) as fun1
from b
Tips:当【所在级别】设置为“细分”时,实际上是将“细分”及【特定维度】中出现在“细分”之前的所有字段都纳入到排序字段中。所以这里的order by子句中的排序字段为“订单日期年”和“细分”。
当将【fun】和【fun1】的计算依据中的【所在级别】改为【类别】时,其计算结果与【所在级别】设置为【最深】时的结果一样。
测试2.2
将【fun】和【fun2】的计算依据中的【所在级别】固定设置为“最深”。此时会发现【重新启动间隔】中可选的字段除了“无”之外,只有“订单日期年”和“细分”两个字段。
当将【所在级别】设置为“细分”时,此时【重新启动间隔】中可选的字段除了“无”之外,只有“订单日期年”。如下图:
这与【特定维度】中字段出现的次序的有关。【重新启动间隔】中可选的字段要在【所在级别】指定的字段之前。
将【重新启动间隔】改为【订单日期年】, 此时两个计算字段的结果如下图:
此时对应的SQL代码如下:
select 订单日期年,细分,类别,row_number()over(partition by 订单日期年 order by 细分,类别) as fun,
sum(销售额)over(partition by 订单日期年 order by 细分,类别) as fun2
from b
当将两个计算字段的【重新启动间隔】改为【细分】时,其对应的计算结果如下图:
此时对应的SQL代码如下:
select 订单日期年,细分,类别,row_number()over(partition by 订单日期年,细分 order by 类别) as fun,
sum(销售额)over(partition by 订单日期年,细分 order by 类别) as fun2
from b
Tips:这里【重新启动间隔】将“细分”以及在【特定维度】中出现在“细分”之前的所有字段都用来分区了(partition by子句)。
总结
- 【所在级别】和【重新启动间隔】并没有提供什么新的功能,从目前的测试结果来看,这两个的作用完全可以通过控制添加到【特定维度】中的字段来代替。(下面提到【特定维度】的时候【所在级别】和【重新启动间隔】取默认值)。
- 【特定维度】指定了数据的排序字段(order by子句),之后会按照字段元素的展示顺序进行排序。而未出现在【特定维度】中的字段则会作为聚合函数的分组依据(partition by子句)。
- 添加到【特定维度】中的字段是有层级关系的。比如测试1.1中先按“订单日期年”进行排序。若"订单日期年“相同,再按“类别”排序。
更多推荐
所有评论(0)