Filter简介
2.2.4 Add a filter to a view
2.2.5 Add a date filter
什么是Filter?
Filter在英文当中是过滤的动词和名词, 我们常说的汽车的空气过滤器, 就叫做Air Filter. 那么我们把这个含义应用在数据里,就是根据我们分析的需求, 过滤掉我们不需要的数据, 只保留我们需要的部分. Tableau在考点当中关于Filter写了两个点: Add a filter to a view和Add a date filter 这两个考点其实是一个意思. Add a filter to a view其实就包括了Add a date filter. 所以你不用太纠结这两个考点的区别. 而且在这一章当中, 我将概括远超于考点的内容. 考试是暂时的, 但是应用是每天的.
Filter不同类型的数据所使用的方法和逻辑是不一样的. 因此我们得先理论上解释一下因为文字, 数字, 日期都有不同的方法. 因此它们的设置也不同.
Filter Text
过滤文字, 一般就是过滤一个Dimension. 我们就拿[Customer Name]这个Dimension为例来看看理论上你能怎么Filter Text.
- 直接手动勾选☑️, 保留哪个Customer Name, 或者排序哪个Customer Name. 这个一般在一个Field内部值的数量比较少的时候 比如十几二十几个的时候比较多见. 或者你已经基于Customer Name创建了一个Group, 然后基于这个Group来过滤. 那至于什么是Group, 请看前边Data Grouping - Create Group 这课
- 基于这个Customer Name的某一部分来进行Filter. 以Aaron Bergman为例, 我们可以将其拆分成各种形式, 然后对它的这个部分来进行过滤.
- 以整串文字作为对象, 查看其中是否包含一段更小的文字. 一般这个叫做substring.
- 这是最复杂的过滤, 你的过滤不再基于某段特定的文字, 而你只知道格式. 我以电子邮件为例, 你的目标是保留所有以 xxxx@xxx.com 这种格式存在的文本. 而至于这个xxx多长, xxx是什么我们是不管的.
- 基于计算的过滤. 也就是Customer Name的筛选不基于Customer Name本身, 而是基于其他Field的计算结果. 我们在Set那一课已经接触过这个概念. Customer Name的Total Sales大于1000就保留, 否则就被过滤.
比如: 我们可以根据空格, 将这个名字拆分成First Name和Last Name. 然后只保留First Name等于xxx的名字
我们也可以根据[Customer Name]的长度, 只保留前3位, 只保留后3位.然后基于这前三位,或者后三位进行过滤.
以Aaron Bergman为例, ron就是一个substring.
Filter Numeric Measure
我在这部分的标题当中写的是Numeric Measure而非Numbers就是想要强调, 我们这里讨论的是在Measure状态的Number,或者说作为一个变量的数值而不是作为文字状态下的数值.
首先我要讲的是我非常不推荐在Direct Filter也就是直接过滤当中使用Filter. 至于什么是直接过滤, 什么是间接过滤 我会在后边提到.
而不推荐的主要原因还是在于这样添加的Filter往往意义不明, 所以很有可能在创建过程中,它的含义就变化了.
我用下边的动图来举一个例子:
假设我想要展示每个总消费高于1000的消费者的下边所有Order ID的明细.
我首先在Tableau当中添加了一个Filter: SUM(Sales) at least 1000, 也就是Sum([Sales]) >= 1000.
然后, 我把Customer Name和SUM(Sales) 拖到右侧, 创建了一个计算每个Customer Total Sales的基本表格. 在这个表格里你会发现, 每个Customer后边的SUM([Sales]) 都是大于1000的.
此时的SUM(Sales)>1000代表的是每个Customer的SUM(Sales)>1000
但是当我把Order ID加入到Customer Name的右侧的时候, 情况一下子发生了变化. 你会发现左侧的Customer Name跟之前的不一样了. 如果我们追踪Aaron Hawkins这个出现在前边表格当中的名字就可以看到, 当Order ID加入之后, SUM(Sales)>1000这个Filter所代表的是每个Customer下边每一个高于1000块销售额的Order ID.
Aaron Hawkins的总消费额是大于1000的, 但是他下边没有一个Order的消费额超过1000, 所以他这个人就不在了. 在这个过程中, SUM(Sales)>1000没有问题. 但是至于SUM(Sales)是代表什么的Total Sales, 这个不由SUM(Sales)说了算, 你在添加这个Filter的时候, 完全控制不了. 这一不受控制就容易出错.

那老师, 这肿么办?
其实答案我在Filter Text下边的第五点就写了, 你所要真正创建的Filter不是把SUM([Sales]) 拉到Filter Card里. 而是应该创建一个基于Customer Name的Filter. 在这Filter下边, 指定SUM([Sales)]>1000.
有的时候, 我们的脑海里想的就是Sales大于1000, 所以我们的直接反应就是把Sales拖到Filter上, 然后让SUM([Sales])>1000. 这是我们的直觉.
但是很多时候, Tableau的一些设置是反直觉的, 这需要时间去学习和克服. 我没有看到任何课程提到这一点, 但是它在学习的过程中却是如此的重要.
下边的这个动图就展示了如何正确的设置的Filter.

Filter Date
我对Filter Date的理解也是分阶段的. 如果你看到这个标题肯定会觉得那老师, 过滤Date无非就是一个开始日期,一个结束日期呗. 大于等于开始日期, 小于等于结束日期呗. 这玩意有啥难的.
当初我也是这么觉得的, 总觉得这应该是我能最快掌握的部分. 毕竟Date也不像前边文字和数字那样, 一个得研究拆分, 一个还得明白数字到底是怎么聚合的.
其实Filter Date这个问题说简单也简单, 说复杂也复杂, 因为简单呢, 确实就是一个大于等于开始日期, 小于等于结束日期的问题. 那说到复杂呢, 这就要涉及到你如何根据需求确定这个开始日期和结束日期.
再往下呢, 还有一个是使用直接过滤还是间接过滤的问题.
再往下呢, 还有一个执行效率的问题. 那我们正篇开始.
Filter Date通天塔第一层: Filter Individual Date
Individual Date就是来源于数据集当中每一行里, 那个Date的值, 只保留2024-01-01, 或者只排除2024-01-02. 就这么简单.
我在下边的动图里展示了如何在[Date]里只保留2020-01-03 或者只排除2020-01-03的操作.

Filter Date通天塔第二层: Filter固定的年月日
在上边的动图当中其实已经出现了这些选项. 在Invdividual Dates的上方:
Years
Quarters
Months
Days
Week Numbers
Weekdays
Month/Year
Month/Day/Year
这些选项的原理和Invidual Dates是一样的. 你可以轻松的选择保留哪些, 排除哪些
Filter Date通天塔第三层: Filter Individual Date Range
Individual Date Range对应的选项是上边列表里的第二项是Range of Date. 你会在界面当中手动选择一个固定的起始日期和一个固定的结束日期.
界面当中的Start Date和End Date选项就是单纯的设置一个起始和结束日期, 它是Individual Date Range的简化版
Filter Date 通天塔第四层: Filter Relative Date Range
Relative Date Range: 相对日期区间或者说相对日期范围.
与前边date range所不同的是, 相对日期区间的定义是变化的, 它以你的报告的打开时间为准.
报告打开的那个时刻, 就是今天. 本文写作的日期是2024-05-05. 那以这个日期作为基准, 今年指的就是2024年, 这个月就是2024年的五月份. 但是当报告在6月份打开的时候, 当月就变成了六月份.
这种时候, 这个基准日或者说这个用来作为”锚定"的日期就显得至关重要. 最常见的锚定日就是今天, today.
这个今天并不是你创建Tableau Workbook的那天, 是指每次这个Tableau Workbook打开的那一天
在理解了这些概念之后, 我们再看Tableau给我们提供了哪些选项.
Years代表, 最小的时间区间单位就是一年. 我先从左下角这个Anchor Relative To选项开始讲, 因为我如果不提的话, 你可能都没注意到这个选项. 但是这是理解这个页面的开始.
在没有勾选的情况下, 我们可以看到默认值是Today, 然后这个选项是灰色的. 代表不可更改. 我们界面当中选中的Last 5 Years.
这是我们再看右上角, Tableau帮助你显示了, 你当前选择的这个选项具体的日期是从2020年的一月一日到2024年的12月31日. 也就是当前这一年的一整年加上过去四年.
只要你遵循这个从下到上的设置顺序, 你就可以设置基于今天的一部分相对时间区间
Filter Date 通天塔第五层: Filter Customised Relative Date Range
从第五层开始, 你就已经无法使用Tableau给你提供的默认选项来创建了. 它必须依赖具体的日期计算来创建. 那么什么样的日期区间是Tableau所提供的选项满足不了的呢?
- 我如果只想保留前一周的周一到周五
- 我如果只想保留从前一周的周一到下周周日的这三周
- 同时保留今年五月份的第一周和去年五月份的第一周
所有上边的这些需求无疑例外都必须要求我们使用Tableau的Date Calculation来自定义这个start date和end date. 它已经无法使用Tableau所提供的默认选项来满足
Filter Date通天塔第六层: Customised Relative Date Range + Dynamic Anchor Date
在第四层当中, 你会发现Tableau提供了一个Anchor Date的选项, 你除了可以选择默认的Today之外, 你还可以tick Anchor Relative to的这个选项. 这个选项里会出现一个日历, 让你用一个固定的日期来作为Anchor Date. 换句说话, Anchor Date要么是Today, 要么是一个Individual Date.
这就带来了另一个问题, 如果我想让我的Anchor Date或者说这个基准日是基于一个动态的日期的话, 那就必须得换其他方法了.
那么什么时候会遇到这种情况? 如果你看完我下边的例子, 你就知道这个情况会经常发生
- 当我们所有的数据源更新不同步的时候, 假设销售数据更新最快每天一次, 物流数据要等两天, 利润要等三天. 那么我们就没法把这个Anchor Date, 设置成当天, 我们必须设置成利润更新的那天. 那么这个Anchor Date就是Today减去三天. 所有的Date Range都要以这个三天前作为标准. 三天前的前一周和今天前的一周可未必是同一周.
- 有的时候, 我们的数据源遭遇了更新的问题. 比如从这个月开始所有的数据都没有. 那么如果我们的图表只显示当月数据的话, 整个报告会是一片空白. 在设计Filter的时候, 你就不能把Today作为Anchor Date. 而是想要把数据源里数据存在的最后一天作为Anchor Date.
这种设置的最大优势就是即使数据没有更新, 使用者在打开报告的时候, 他们也能看到以前的数据. 而不至于因为数据停更, 导致用户以为报告坏了.
第六层的教学没有办法在这里完成, 因为你必须先学习Tableau的Date Function才能知道如何计算start date和end date. 这里只是提前让你了解如果你需要这样的Filter, 它的难度在第几层
Filter Date通天塔第七层:提升性能
在前边的时候, 你还不用考虑这个问题, 但是当你的Tableau Dashboard已经到了要考虑刷新速度的时候, 那么你就需要了解这第七层的知识了.
我以保留所有2024年所有1月份的数据为例来解释一下如何提升性能. 提升性能的意思非常简单,就是让Tableau的刷新变快.
第一种方式我们可以计算每个日期的年份和月份, 然后让Year([date]) = 2024 and Month([date]) =1
第二种方式是我们可以让[date]>=’2024-01-01’ and [date]<=’2024-01-31’
这两种方式都可以达到只保留2024年1月份数据的目的. 但是如果我们从计算机的角度来对比一下这两个过程.
在第一种方式当中: 我要计算每一个日期的年份, 假设一共有1000行, 那我得计算1000遍, 接下来, 我要将前一步的结果和2024进行比较, 那么又是1000遍. 整个过程加起来2000遍
现在来到月份, 我又要重复之前的步骤, 只不过这次是月份=1, 又是2000遍. 加起来4000遍
那么现在来到第二种方式: 我只是比较我当前的Date和2024-01-01比谁大: 1000遍. 我再和2024-01-31比谁小: 1000遍. 一共加起来2000遍. 是不是直接计算量就少了一半?
但是这还没完. 如果我们单纯比较 计算[date]的年份 和 [date]比2024-01-01谁更大 这两种计算的话, 计算年份的这一过程就又比单纯比较两个日期谁大更复杂. 如果我们再将这些Filter镶嵌到其他的计算当中, 那么就会产生连锁的反应. 所以这通天塔的最后一层已经无关怎么创建这个Filter, 而是如何用最好的方法来创建这个filter.