函数用法部分会持续补充!

1.Tableau函数概况

  Tableau包含丰富的函数,包括数字函数、字符串函数、日期函数、类型函数、逻辑函数、聚合函数、直通函数、用户函数和表计算函数等。除了根据函数名称对其功能进行判断之外,Tableau本身也提供了函数声明,如下图:

2.Tableau函数执行说明

  在最初学Tableau的时候,创建计算字段的时候经常面临的问题就是不知道要不要在公式中加入聚合函数。以【订单-超市】数据中的“利润率”计算为例,利润率=[利润]/[销售额] 或者 利润率=sum([利润])/sum([销售额])。这两个计算字段产生的计算结果是完全不同的,具体可以参考: https://blog.csdn/yeshang_lady/article/details/104877319。这里希望能把这个问题讲清楚。
  以【订单-超市】数据为例,创建两个计算字段【fun1】和【fun2】(这两个字段的主要区别在于IF的判断条件中是否使用了聚合函数SUM),具体如下:

构建如下图的工作表,观察【fun1】和【fun2】的计算结果。

根据【fun1】和【fun2】的计算结果,使用Python直接对原始数据源进行处理,可以完全复现这两个计算字段的结果,具体代码如下:

import pandas as pd
#path位置可能不同
path='/Users/sherry/Documents/我的 Tableau 存储库/数据源/2018.1/zh_CN-China/'
data=pd.read_excel(path+r'示例 - 超市.xls')
data['订单日期年']=data['订单日期'].dt.year

#复现fun1
def fun1(x):
    return (x>100).sum()
result_fun1=data.groupby(['订单日期年','类别'])['销售额'].sum()

#复现fun2
tmp=data.groupby(['订单日期年','类别'])['销售额'].sum()
result_fun2=(tmp>1000000).replace({False:0,True:1})

同样可以写出这两个计算字段对应的SQL伪代码,具体如下:

--fun1伪代码
select 订单日期年,类别,sum(case when 销售额>100 then 1 else 0 end) as fun1
from 订单-超市
group by 订单日期年,类别

--fun2复现
select 订单日期年,类别,case when sum_销售额>1000000 then 1 else 0 end as fun2
fromselect 订单日期年,类别,sum(销售额) as sum_销售额
from 订单-超市
group by 订单日期年,类别)a

  根据以上代码及计算结果可以得出以下结论:

  • 对于【fun1】,该函数实际作用在原始数据中的每一条记录上,然后再依据分组将结果进行汇总求和(默认值)。若想更改默认计算,可以通过“度量”修改,具体如下图:
  • 【fun2】则是先对每个分组中的数据先应用聚合函数SUM([销售额]),然后再对分组聚合后的计算结果应用IF判断。这样得到的计算字段【fun2】是个聚合字段。

  至于Tableau中的哪些函数内部可以嵌套聚合函数哪些不可以嵌套聚合函数,没有办法一概而论。

3.函数用法

3.1 ATTR()函数

  用法:ATTR(expression)
  作用:如果给定表达式对于组中的所有行仅具有单个值,则返回该表达式的值,否则返回*。以【订单-超市】数据为例,构建计算字段【fun1】,其公式如下:

将【类别】和【子类别】拖拽到【行】中,将【fun1】拖拽到【标签】中,可以得到如下结果:

ATTR()作用于每个分组内的数据,所以ATTR()里面的表达式不可以再使用聚合函数。上图中的计算结果结果,其对应的SQL伪代码如下:

select 类别,子类别,ATTR(类别) from 订单-超市 group by 类别,子类别
3.2 日期函数

  Tableau中提供了17种日期函数,具体如下:

函数名函数用法函数作用
DATEADDDATEADD(date_part,increment,date)返回increment和date相加的结果。
DATEDIFFDATEDIFF(date_part,date1,date2,[start_of_week])返回date1和date2之间以date_part为单位的时间差
DATENAMEDATENAME(date_part,date,[start_of_week])以字符串的形式返回date中的date_part部分
DATEPARSEDATEPARSE(format,string)将字符串转化为指定格式的日期
DATEPARTDATEPART(date_part,date,[start_of_week])以整数的形式返回date中的date_part部分
DATERUNCDATERUNC(date_part,date,[start_of_week])以date_part指定的精确度截断指定日期
DAYDAY(date)以整数形式返回指定日期的天数
ISDATEiSDATE(string)如果给定字符串为有效日期,返回True,否则返回False
MAKEDATEMAKEDATE(year,month,day)返回一个依据指定年份、月份和日期构造的日期值
MAKEDATETIMEMAKEDATETIME(date,time)返回合并了date和time的datetime
MAKETIMEMAKETIME(hour,minuter,second)返回一个依据指定小时、分钟和秒构造的时间值
MAXMAX(expression)或MAX(expr1,expr2)返回两个值中的较大值
MINMIN(expression)或MIN(expr1,expr2)返回两个值中的较小值
MONTHMONTH(date)以整数的形式返回给定日期的月份
NOWNOW()返回当前日期和时间
TODAYTODAY()返回当前日期
YEARYEAR(date)以整数形式返回给定日期的年份

以上部分函数中都用到了date_part,这是一个常量字符串函数,其取值固定并且区分大小写,即不能用‘DAY’来取代‘day’,其具体可取的值如下:

date_part参数值
‘year’4位数年份
‘quarter’季度值,取值为1-4
‘month’月份值,取值为1-12或January\February等
‘dayofyear’一年中的第几天,取值为1-366
‘day’一个月中的第几天,取值为1-31
‘weekday’一周中的第几天,取值为1-7或Sunday\Monday等
‘week’一年中的第几周,取值为1-52
‘hour’0-23
‘minute’0-59
‘second’0-59
3.3 TOTAL()函数

  用法:TOTAL(expression)
  作用:返回给定表达式的总计(这里所说的“总计”并不等于求和操作)。TOTAL是Tableau中的表计算函数,会对组内分区的所有数据库行进行汇总操作。为了便于说明,构造如下两个计算字段:


构建如下图表(注意此时“订单日期”筛选器选择的是“全部”):

从上图结果中可以发现,TOTAL()函数的作用和Fixed型表达式有点像,都是直接在组内分区的所有数据库行上执行指定的操作。然后调整“订单日期”筛选器的值,当选择“2016年”时结果如下:

此时“销售额_total”的值发生了变化,但“销售额_fixed"没有发生变化,这是TOTAL()和Fixed表达式的一个区别:Fixed表达式的优先级比维度筛选器高,所有其计算结果不受维度筛选器的影响,但TOTAL()则会受到维度筛选器的影响。

3.4 窗口函数

  Tableau中的窗口函数可以对指定偏移范围内的数据进行操作(和SQL里的窗口函数作用类似)。Tableua中提供的窗口函数如下:

函数作用
window_avg返回窗口中表达式的平均值
window_count返回窗口中表达式的计数
window_median返回窗口中表达式的中值
window_max返回窗口中表达式的最大值
window_min返回窗口中表达式的最小值
window_percentile返回与窗口中指定百分位相对应的值
window_stdev返回窗口中表达式的样本标准差
window_stdevp返回窗口中表达式的有偏差标准差
window_sum返回窗口中表达式的总计
window_var返回窗口中表达式的方差
window_varp返回窗口中表达式的有偏差方差

下面以window_sum()函数为例说明其用法。用法:window_sum(expression,[start,end]),其中start和end指定与当前行的偏移:当取负值时,取当前行的前n行;为正值时取当前行的后n行;start指定窗口的开始位置,end指定窗口的结束位置;若为指定start和end,则使用整个分区。在【超市】数据上,构建如下两个计算字段:


构建如下图表:

参考资料

  1. 《Tableau数据可视化:从入门到精通》

更多推荐

Tableau:常用函数