Tableau 我常用函数整理
日期函数
dateadd
-
datedadd (date_part, interval, date) 表示在日期 date 的基础上, 以date_part 为单位, 与之间隔 interval的日期
-
dateadd ("month", -3, #2020/3/8#) 则返回 2019/12/8 0:00:00;
-
dateadd("day", -7, #2020/3/8#) 则返回 2020/3/1 0:00:00 查看过去一周, 半年, 3个月等的日期会用到.
datediff
- datediff (date_part, start_date, end_date, [start_of_week]) 计算两日期的差, 以 date_part 为单位.
- datediff("week", #2020/3/8#, #2020/3/9#) 返回 0 , 3/8 与 3/9 相差 0 周
- datediff("week", #2020/3/8#, #2020/3/9#, "monday") 返回 1 因为 3/8 是周日, 一周开始若为周一, 则相差一周啦.
isdate
- isdate (string) 判断一个字符串是否为有效日期. 是则返回 "真", 否则 "伪"
- isdate("2020/3/8") ; isdate("2020-03-8") 返回 "真"
makeday
- makeday (year, month, day) 构造一个包含 年, 月, 日 的日期值, 常用于数据提取, 日期比较等
- makeday (2020, 3, 8) 则返回 2020/3/8
maketime
- maketime (hour, minute, second) 构造一个包含 时, 分, 秒 的日期值
- maketime (8, 30, 0) 则返回 1899/12/30 8:30:00
max, min
- max (date1, date2) 也可用于比较两个时间, 返回 较近/ 较远 的一个距今
- max (#2020/1/1#, #2020-3-8#) 返回 2020/3/8; min 则是相反的用法
now
- now () 返回当前的日期和时. 配合 date, year, month 就很灵活了.
- now () 返回 2020/3/8 23: 22:26
- year(now()), month (now ()), date(now()) 分别返回 2020, 3, 2020/3/8
today
- 返回今天的日期. today () 则返回 2020/3/8 . 经常用作与一个 动态的参数值. 比如日报中算环比, 同比都会用到
类型转换
date
- 将给定的 字符串, 数字, 日期 表达式转为日期类型. 常用于强行转换, 比如对 数据库中的各种时间强行转换
- date("2020/3/8") 和 date("2020-3-8 2:22:22") 和 date(2020, 3, 8) 都返回 2020/3/8 这样就能准确比较了
datetime
- 跟 date () 一样的, 只不过更加精确到 时, 分秒. 也是会用在时间的比较上的
- datetime ("2020-3-8 22:22:22") 返回 2020/3/8 22:22:22; 而 datetime ("2020/3/8") 返回 2020/3/8 0:00:00
float, int
- 将表达式转为 浮点数或整数. 注意的是 int 不是四舍五入, 而是直接取整.
- 时间其实也是一个 数字类型. int (#2020-3-8#) 返回 43896; int("666") 返回 666; int("aaa") 则啥都没有.
str
- 将表达式转为字符串类型. 可用于, 字符串的拼接. 如 字段拼接, 构造唯一值等场景. 大类, 小类 排序会用到
逻辑函数
if
- if 条件 then 表达式 end
- if 条件 then 表达式1 else 表达式2 end
# 多层嵌套
if [当期值] > 10000
then if [同期值] > 10000
then "1好"
else "2好"
end
elseif [当期值] <= 10000 and [当期值] > 5000
then "较好"
else "不好"
end
....
case
- 跟 if 的作用基本一样, 但使用更加方便, 尤其在返回结果比较多的情况下
case 表达式
when 值1 then return1
when 值2 then return2
when 值3 then return3
...
else reurnx
end
比如, 对 "省市" 字段进行 区域的划分 (创建计算字段 "大区")
case [省市]
when "吉林" or "辽宁" or "黑龙江" then "东北"
when "安徽" or "江苏" or "浙江" or "福建" then "华东"
when "江西" or "河南" or "湖北" then "华中"
else "未划分"
end
ifnull
- ifnull (expr1, expr2) 如果结果不是 null, 则返回 expr1 否则 返回 expr2 判断时可对 if xxx else ... 优化
- ifnull ([当期值], [同期值]) 等价于, 将当期值的 缺失值 用 同期值填充了.
isnull
- isnull (expr) 返回布尔值. 如果表达式为 null 则返回 "真" 否则返回 "伪"
- 注意的是, isnull (null) 返回 "真"; isull(" ") 返回 "伪". 空字符串不是空哦, 注意跟有点编程语言的区分
聚合函数
Tableau 的拖拽字段到行列, 其实就是执行了大致 SQL: 聚合函数(度量字段) group by [维度]. 默认是 sum. 这就解释了在计算字段的时候, 有的时候需要手动加 sum, 有时候又不需要. 这就需要想想它 原本的 sql 大致是怎样的逻辑即可
count
- 对离散或度量字段, 进行计数, 会忽略 null 值, 不去重
countd
- 对离散或度量字段, 进行计数, 会忽略 null 值, 会去重
- 统计门店数据量, 大区啥的都经常会用到. 注意, 表连接(混合数据源) 不能用 countd. 可通过 sql来 Union 解决
sum
- 只能对度量字段 求和, 会忽略 Null 值. Tableau 默认对度量字段聚合,要看每一条则在 数据 -> 取消聚合 即查看
avg
- 只能用于度量字段 求均值, 会忽略 Null 值
max, min
- 度量字段的最值; 传字符串则返回原值; 也可用做两个时间比较(如上提到)
attr
- attr ([expr]) 如果 expr 的每一行都有值, 则返回该值. 否则返回 * , 会忽略 Null 值
median
- 只能用于度量字段, 求中位数, 会忽略 Null 值
表计算函数
total
- 返回给定表达式的总计, 常用于计算 各自分区中 的全部行的 聚合值等
- total (sum([销售量])) 表示计算 各自分区中的全部行的 sum([销售量])
index
- 返回分区中当前行的索引, 不包含于是值相关的任何排序. 常用于对某个字段和 [手机品牌] 按特定的顺序排列
....
这部分很多, 但目前很多, 没用到, 或者是不会用.
详细级别函数
也称为 " LOD" 表达式 或 "LOD" 计算.
是除视图级别外, 的其他维度上支持聚合, 能实现将 一或多个 维度 附加到 任何的聚合表达式.
与表计算, 参考线等不同在于, LOD 是在数据源中计算的. 针对大型数据源, 会大幅度提高性能 但同时也会导致 Tableau 运行更加复杂的查询 (如多表连接), 在基础数据源缓慢的情况下, 影响性能.
- 固定 (fixed) : 灵活选择 高于 或 低于 视图层, 各个维度进行 group by 再 aggregation
- 包含 ( include): 用于创建 高于 视图层的, 来分组聚合.
- 排除 ( eclude): 用于创建 低于 视图层的, 来进行分组聚合.
表达也似乎不大准确, 举个栗子就好了.
fixed
- {fixed [维度1], [维度2]... : 聚合函数 (度量字段)} 表示 对维度 dim1, dim2 ... 的维度进行聚合操作.
- fixed 计算 在维度筛选器 之前应用, 但会受到 上下文筛选器, 数据源筛选器, 和数据提取筛选器的影响. 如果想要将筛选器应用于 fixed 表达式级别 而又不想用 上下文筛选器. 则可将其改为 include 或 exclude 表达式
通常用 fixed 这样的 LOD 表达式, 可以生成度量或维度.
- {fixed [商品ID] : sum ([销量])} 是计算, 每件商品, 销量的总和
- {fixed [商品ID], [年份] : sum ([销量]) 是计算每件商品, 每年 的销量总和
- {fiexd [商品ID] : min ([订单日期]) 是计算, 每件商品的, 最早订单日期
来个栗子, 以超市数据为例, 计算 每个地区中, 每个省份的销售量, 先建一个计算字段.
然后再将 "地区" 和 "省" 放到列, 再将 地区映射到 颜色做区分.
与之相关的还有 include 和 exclude 的 LOD 表达式, 我暂时没有用到过, 就不写了先. 用到再说吧.
我感觉, 这个 Tableau , 慢慢用下来, 还是有点香的, 慢慢记录有空的话.