ISONORAFTER 和 ISAFTER 是布尔函数,它模拟 Start At 子句的行为,先对所有用于比较的列按声明的规则依次排序,然后对第一个满足所有条件参数的行及其之后的所有行返回 True (ISONORAFTER),或仅对之后的所有行返回 True(ISAFTER)。下面以 ISONORAFTER 为例进行说明:
ISONORAFTER
ISONORAFTER ( <Value1>, <Value2>, [<Order>], [<Value1>,<Value2>,<Order>] ... )
ISONORAFTER 接受可变数量的三元参数组,组中的前两个值是要比较的表达式,第三个参数表示排序顺序。排序可以是升序(默认)或降序。第一参数与第二参数根据排序顺序进行比较。升序时执行的比较是第一参数大于或等于第二参数。降序则是第一参数小于或等于第二参数。此函数通常用于迭代函数的筛选条件中。
参数 | 属性 | 描述 |
---|---|---|
Value1 | 可重复 | 与第二参数进行比较的表达式 |
Value2 | 可重复 | 与第一参数进行比较的表达式 |
Order | 可选 可重复 |
指定的排序. 0/FALSE/DESC – 降序; 1/TRUE/ASC – 升序. |
ISONORAFTER 和 ISAFTER 在官方文档中的介绍比较简单,这里补充一些它的详细计值过程,按计算顺序描述如下:
- 对所有参数组中的第一参数按第三参数声明的规则进行排序,第一个参数组中的列首先排序,依次类推,得到一个排序后的表。
- 对排序后的结果依次使用每个参数组逐行判断,对第一个满足所有参数组的行及其之后的所有行返回 True。
需要注意的是,Order 参数有两个作用:用于指定列的排序规则,确定前两个参数的比较规则。参数组的排列顺序会影响排序结果和执行判断的顺序,进而影响返回的行数。
ISAFTER 的计值过程与 ISONORAFTER 类似,区别在于它的判断中不包含等于,只考虑大于或小于。在这两个函数的比较中,Blank()和空字符串被认为是不同的值,以升序为例,空字符串排在 Blank()后面。
示例用法
以下两种写法使用 2008 年和 10 月作为筛选条件,返回满足条件的年月组合,由于交换了 ISONAFTER 中年份和月份列的顺序,得到了不同的结果
//年份在前月份在后,返回 2008 年 10 月之后的所有年月组合 EVALUATE FILTER ( SUMMARIZE ( 'Date', 'Date'[Calendar Year Number], 'Date'[Month Number] ), ISONORAFTER ( 'Date'[Calendar Year number], 2008, ASC, 'Date'[Month Number], 10, ASC ) ) ORDER BY 'Date'[Calendar Year number], 'Date'[Month Number]
//月份在前年份在后,返回包含 10-12 月的所有年月组合 EVALUATE FILTER ( SUMMARIZE ( 'Date', 'Date'[Calendar Year Number], 'Date'[Month Number] ), ISONORAFTER ( 'Date'[Month Number], 10, ASC, 'Date'[Calendar Year number], 2008, ASC ) ) ORDER BY 'Date'[Month Number], 'Date'[Calendar Year number]
两种写法的结果如图所示:
当使用常数进行判断时,只要有一个参数组返回 True,ISONORAFTER 和 ISAFTER 就会返回 True
= ISAFTER(1,2,DESC,2,2,DESC) //返回 True,因为第一组返回 True = ISONORAFTER(1,2,DESC,2,1,DESC) //返回 True,因为第一组返回 True
高飞老师,文中讲isonorafter函数常用于迭代函数的筛选条件,并进行了举例,我有个疑问:举例中的filter为迭代函数,一般理解是逐行进行条件判断,符合条件的行保留再继续判断下一行,但是文中用isonorafter作为筛选条件,好像不能用逐行判断的思路去理解,是这样的吗?
老师,帮忙看下这个地方,是不是官方更新了ISONORAFTER用法,谢谢!
高飞老师,如下图所示,是递进的关系,我做成切片器。我想通过度量值实现,我选 员工名字的时候,就显示员工姓名,我选经理姓名的时候就显示经理的姓名。不是在切片器里显示,是我单独写一个度量值,在我其他的可视化图片里作为标题显示。要怎么实现啊?
高飞老师,如图所示,上面切片器里,有BGT,ACT等维度,但是,下面的“BGT”这个度量值,不管上面切片器选 什么维度,都是等于所有维度等于”BGT”之和,这个度量值不受切片器的影响。我需要用什么函数?
老师,如果想要过滤小于或等于 2008 年 10 月的月份,是不是参数用降序就可以。