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")
)

 

参考文档:

Filter context

Avoid using FILTER as a filter argument

Filter functions

posted @ 2019-07-23 11:03  悦光阴  阅读(9357)  评论(0编辑  收藏  举报