问:
使用场景:筛选器中有大类、小类、项目三个维度,视图中行级别是团队(一个维度),求前10团队团队对应的某度量聚合值在整体度量值中的占比是多少?
尝试一:用{exclude [团队]: sum([度量])}作为”整体度量“,发现这个计算字段得出来的值会比真实的少,因为团队作为维度筛选器是在excelude这个lod计算表达式之前的。这种方式结果有问题的,又尝试了fixed。。。
尝试二:用{ fixed [大类]、[小类]、[项目]:sum([度量])} 作为“整体总量”时发现,某些团队的项目有3项,某些有5项,这样得出来的“整体总量“是不一样的,这也不是想要的效果。
想请教各位大神有没有遇到类似的情况,如何解决?
喜乐君答:
大清早掠过,既然提问者到我的知乎私信了,我就回来回答一下,说一下此类问题的思路,而非简单地回答问题。 1、但凡涉及到“占比”问题,首选的计算是表计算——表计算的“合计百分比”(total),而非FIXED LOD。
虽然合计百分比也是两个详细级别的问题,虽然表计算的“合计”(Total)也确实可以对应LOD表达式的Exclude LOD;但是表计算永远是最优考虑,因为性能更好、更容易理解。
2、由于表计算的计算级别比较低,表计算只能对视图中数据有效,所以第一确认是,“占比”是否仅仅对视图中筛选后的结果有效。
3、占比的对象是“前10”,这就涉及到要把数据库中的离散字段,取出来一部分作为样本。“前10”最早是出现在“筛选器”功能——顶部筛选中,但是筛选仅能保留 前10,不能同时保留“前10”和“前10之外”,所以需要用“筛选”之后的更高级的功能——集set。
集用于把某一部分筛选的结果保存为样本,同时集是布尔计算,相对于把数据一分为二,特别适合于基于动态条件的内外对比。
4、有了集set,有了表计算,占比就可以完成了。
5、筛选器仅仅用于缩小整体的数据样本。但是由于集的操作顺序优先于维度筛选器,因此如果要对筛选之后的数据有效(大类、中类等),那么把筛选器“加到上下文”,解决优先级问题。
6、注意,全程其实不会涉及到LOD表计算——虽然Total背后可以对应exclude LOD!
不要因为刚刚学习了LOD,加上LOD看上去很高级,就认为高级计算都要用它,LOD计算,仅用于在表计算无法完成任务,且当前视图中增加另一个详细级别(level of detail)的聚合时才有效!
如果学习了什么,就用什么解决一切问题,这就是典型的“铁锤人倾向”:
——“在手里拿出锤子的人看来,到处都是钉子”。
最后,推荐一下我的新书吧 ,京东有售。刷新历史最高价,但是也刷新你对tableau的认识。
《数据可视化分析:Tableau原理与实践》