DAX 第三篇:筛选上下文 和 Filter函数
Visual上的任何一行或一列都是一个过滤上下文,切片器也是一个过滤上下文,或者报表上其他类型的过滤器,甚至Visual之间的交互,这些过滤上下文共同构成了一个单元格的过滤上下文。总的来说,报表的每个元素都可以创建过滤上下文,并且报表的每个单元格都有不同的过滤上下文。总结来说,筛选上下文是在报表中创建的,DAX中只有CALCULATE和CALCULATETABLE两个函数可以创建筛选上下文。
筛选上下文自动利用关系,筛选上下文自动通过关系来传递,筛选上下文传递的方向是关系的关系。筛选上下文会筛选整个数据模型,也就是说,一旦应用了筛选上下文,整个数据模型将会根据关系进行筛选。
DAX中最容易引起误解的一个函数是FILTER函数,它是一个迭代函数,不会修改筛选上下文,该函数受到筛选上下文的影响,并根据条件返回数据的子集。修改筛选上下文的函数有多种,ALL系列函数是其中的一类函数,用于清除筛选上下文。
一,筛选上下文的构成
通常来说,DAX中的筛选上下文由三部分构成:关系,查询上下文中的单元格(每行的列值)以及报表元素之间的交互构成的过滤,外部切片器构成的显式过滤。
1,关系
在数据模型中创建关系,指定交叉过滤器,作为筛选上下文的组成部分,因此,筛选上下文自动使用关系,并且根据关系所设置的交叉过滤器方向,产生不同的行为。由于数据模型中关系的存在,因此筛选上下文会筛选整个数据模型。
2,查询上下文
在当前查询的上下文中,每行的列值也会作为过滤器,例如,ProductCategoryName和Color是当前查询上下文的行过滤器:
报表元素之间的交互也会构成过滤,影响其他单元格的值。
3,外部切片器
在报表中设置的切片器,是在查询上下文外部的设置的过滤器,例如,上图中的Color切片器就是外部切片器。
二,FILTER函数
Filter函数不改变筛选上下文,Filter函数是一个迭代函数,它扫描一个已经被筛选上下文过滤后的表,根据<filter>参数返回该表的子集。<filter>是一个bool表达式,对<table>的每一行进行判断,返回结果为True的数据行。
FILTER(<table>,<filter>)
参数是布尔表达式,用于逐行执行,对表进行过滤,返回条件为True的行,而移除条件为False的行,例如:
FILTER(FactSales, [Amount] > 0 or [Region] = "France")
此函数不会单独使用,通常需要结合迭代函数和CALCULATE函数来使用,它的用法需要深刻理解CALCULATE函数过滤上下文。
对于以下的DAX表达式,Filter函数内嵌在CALCULATE函数,并在已有的过滤上下文中对表[Product]表进行过滤。CALCULATE 函数接受 FILTER 函数返回的表表达式,FILTER 函数针对 Product 表的每一行计算其过滤器表达式,只返回Color为Red的数据行:
Red Sales = CALCULATE( [Sales], FILTER('Product', 'Product'[Color] = "Red") )
这个Measure的等价写法如下,虽然结果是相同的,但是第二种写法的性能更高,它使用布尔表达式而不是表表达式。 KEEPFILTERS 函数确保应用到Color列的任何现有过滤器都被保留,而不是被覆盖。
Red Sales2 = CALCULATE( [Sales], KEEPFILTERS('Product'[Color] = "Red") )
参考文档: