03.03 进阶筛选上下文


#
#

进阶筛选上下文

筛选上下文是一个复杂的概念,我们按复杂性递进的顺序将文章分为了初识、进阶和理解三部分。在读完理解筛选上下文之后,你才能最终明白它是如何工作的。请按顺序阅读这三篇文章,以便一步一步地接近最后的真相。 在上一篇文章中,我们给筛选上下文的最初定义是应用于模型的一组筛选器,它改变了整个数据库中可见的行。即使这是一个正确的定义,它仍然是非常初级的。为了深入下一个级别,你需要记住VertiPaq (运行DAX的数据库)是一个列式数据库,你应该停止以表格的思维考虑问题,转而考虑列。## 从行式到列式 例如,你可以将产品表看作一个常规表,如图所示03.03 进阶筛选上下文 - 图1你可以将产品表视为一个标准形式的表,由行组成,每行被划分为多个列但是,因为VertiPaq是一个列式数据库,所以表的正确表示形式应该是一组列,而不是单个表实体。因此,同一个表更合理的的展示形式是这样的。03.03 进阶筛选上下文 - 图2产品表的准确展示形式是一组列的集合,每列被分成多个行表的内容没有变化,但是现在更容易把不同列视作存储在内存中的不同单元。显然,相同的表示方法适用于数据模型中的任何表。因此,你应该在心里将模型中的每个表划分为单独的列,最终会得到一组列的集合。虽然从逻辑上被称为表,但每个列与其他列分离。当你在切片器中添加颜色时,DAX对该列应用了一个筛选器。请仔细阅读这段话:它不会对包含列的整张表应用筛选器。它只对列应用筛选器。然后,因为列是表的一部分,因此表也会有一个筛选器。然而,筛选器一次只对一列生效(此处描述的内容已经接近真实情况;我们将在理解对筛选上下文中进行最终阐述) 当你在切片器中筛选,比如说,红色产品的时候,模型将具有此筛选器,如图所示03.03 进阶筛选上下文 - 图3筛选红色产品会产生一个只应用于颜色列的筛选器你可以将这个单列的筛选器想象成针对列值创建的位图索引,或者用一种更容易理解的方式,理解为列的活动值列表。最后,我们对筛选上下文做一个更准确的定义: 筛选上下文是一组表的集合。每个表包含一列,每列包含引擎认为在当前上下文中可见的所有值。所有这些筛选条件置于AND逻辑中取交集,形成了筛选上下文。对于透视表的单个单元格,筛选条件可以来自切片器、筛选器;可以来自透视表的行和列。每个筛选条件都对由单列组成的表的集合进行操作。因此,在前面的示例中,筛选上下文包含三个独立的筛选条件:一个用于类别,一个用于子类别(都位于透视表的行标签),一个用于颜色(来自切片器)。## 小结 以上描述帮助我们更好地理解了筛选上下文在更新时发生了什么,如果你想要更新筛选上下文,你需要为模型中某些或所有被筛选的列提供一个新的值列表。DAX将用新列表替换该列(且仅替换该列)上的筛选器,通过这种方式,DAX生成了一个新的筛选上下文。需要记住的两个重要方面是:

  • 每个筛选器都对应了某一列活动值的集合
  • 每个筛选器只施加到单列 请记住,这还不是筛选上下文的正确定义。在成为一个真正的DAX大师之前,你必须学习许多其他方面的知识。尽管如此,这个定义对于开始使用筛选上下文已经非常有用。