在上一篇中,我们通过对比sum、total、running_sum、window_sum介绍了主要的表计算函数,其中有一个非常重要的还没有说,那就是lookup()。我们结合应用,说一下lookup的强大用法,然后介绍一下默认的快速表计算。

一、LOOKUP(expression, [offset])

这个函数的目的,是返回目标行(指定为与当前行的相对偏移)中表达式的值。

offset是查询时调整偏移的参数,如果偏移量为0,返回自身;直接使用数字,则相当于当前位置的偏移;也可以使用 FIRST() + n 和 LAST() – n ,以分区中第一行/最后一行为基础设定偏移量。如果省略了 offset,则可以在字段菜单上设置要比较的行。如果无法确定目标行,则此函数返回 NULL。

1)如果省略了offset,必须右键编辑表计算,指定比较行;这一点需要特别注意。

2)如果指定了offset,返回与目标行中expression的值。

表计算lookup.png

「Nov 9, 2018补充」今天一个客户希望计算一个累计值和另一个累计值的和,第一个累计值就是K-in字段的running_sum,第二个累计值是K-out字段偏移一位的running_sum,因此结果就是:

Runnning_sum(sum([k-in]))+lookup( Running_sum(sum([K-out]),-1)

 

二、快速表计算

在第一篇和本篇的基础上,我们下面说一下常见的快速表计算。Tableau内置了部分常用的表计算,称之为 “快速表计算”,这些快速表计算可以视为是预设好的表计算表达式,使用了上面我们介绍的lookup、first等快速表计算。我们也可以通过把视图的快速表计算拖入度量中查看具体的表计算公式。

表计算.png

比如说,我们在实例中添加了“总额百分比Percent of Total”,然后可以拖入度量生成字段,之后查看它的计算公式,如下图:

快速表计算

A 常见快速表计算

第一类的快速表计算与日期无关,常见的七种快速表计算的基本对应关系如下:

  • 汇总 Running Total=RUNNING_SUM(SUM([Sales]))
  • 差异 Difference= ZN(SUM([Sales])) – LOOKUP(ZN(SUM([Sales])), -1)
  • 差异百分比 Percent Difference = (ZN(SUM([Sales])) – LOOKUP(ZN(SUM([Sales])), -1)) / ABS(LOOKUP(ZN(SUM([Sales])), -1))
  • 总额百分比Percent of Total = SUM([Sales]) / TOTAL(SUM([Sales]))
  • 排序 Rank = RANK(SUM([Sales]))
  • 百分位 Percentile = RANK_PERCENTILE(SUM([Sales]))
  • 移动平均 Moving Average = WINDOW_AVG(SUM([Sales]), -2, 0) (前两位到当前)

B、日期类快速表计算

另外的四个快速表计算是基于连续时间的,其中前三个需要详细级别至少到“年”, 当存在多个日期维度时,分区字段默认为更高详细级别的字段,比如有年、季度,则以季度计算。

  • 年度累计 YTD Total = RUNNING_SUM(SUM([Sales]))
  • 复合增长率 Compound Growth Rate = POWER(ZN(SUM([Sales]))/LOOKUP(ZN(SUM([Sales])), FIRST()),ZN(1/(INDEX()-1))) – 1
  • 年度同比 YOY Growth = (ZN(SUM([Sales])) – LOOKUP(ZN(SUM([Sales])), -1)) / ABS(LOOKUP(ZN(SUM([Sales])), -1))

! 使用日期类表计算时有一个前提,视图中必须有相应的日期字段。

  • 年度累计、年度同比:详细级别必须是 「年」
  • YTD累计、YTD同比:详细级别必须是你想要表达的D,比如month或者day,不能是年。

上面的两个分类,可以看一下下面的演示,我把表计算加入到了度量中并分类。

快速表计算  A.png

C 特殊类-二次表计算

在表计算中,比较特殊的是最后一个“年度累计增长率”,YTD Growth ,当我们添加这个表计算,并拖入到度量中时,会发现度量中出现了两个计算字段,中文下是“计算10”和“计算10  1”(10代表的是第10次通过拖动生成计算字段),英文下就是“calculation 10”和“calculation 10 1”,为什么?因为年度累计增长率是二次表计算,虽然也可以在一个公式中表明,但这样更有助于用户看清楚。我们把两个表计算改为 “YTD SUM”计算累计绝对值,和“累计增长率YTD growth”两个字段。

  • YTD SUM = RUNNING_SUM(SUM([Sales]))
  • 累计同比 YTD Growth = (ZN([YTD SUM]) – LOOKUP(ZN([YTD SUM]), -1)) / ABS(LOOKUP(ZN([YTD SUM]), -1))

快速表计算  C-2.png

 

用上面的方法,可以更快的了解每个快速表计算背后的逻辑,从而更好地考虑使用场景并选择。

 

三、关于表计算的总结

表计算是一种高效而快速的Tableau计算,它有几个显而易见的好处,

其一,不需要读取数据源,因此计算更快,基本不影响性能,真正的“所见即所得”;其二,可以一个计算字段返回多个数值,因此在执行移动运算、递归运算、自身运算等情形下,是其他计算不能代替的;其三,预设的快速计算和二次计算方法,基本满足大多数需求,无需代码开发,学习成本低。

当然,使用表计算也有需要注意的地方,

1、表计算在操作顺序中的优先级低于所有的筛选器,因此调整筛选器之后,表计算都会根据新的视图数据重新计算,因此要特别注意数据的详细级别,如果视图中没有了去年的数据,表计算的YTD就无法运行;

2、编辑表计算时需要理解分区和寻址这两个概念,这是表计算运算的逻辑基础,分区隔离了表计算,寻址确定运行的顺序。高级操作时需要熟练掌握分区、寻址和二次表计算的使用。

想要了解更多关于计算的知识,请阅读以下博文。 如有错误,敬请联系提醒,感谢备至。

 

  • 表计算是本地计算,而不是数据库中处理;
  • 表计算以视图返回的结果为计算依据;
  • 表计算可以分为快速表计算和手动表计算两类。

计算类

David. Wu 186-1551-1300 (微信)

Tableau Partner & Fans

 

7 Oct 2018
1 Nov 2018 update QingDao
Nov 9, 2018 revise G191 railway