跳至正文

【DAX】筛选上下文和行上下文是什么意思?

标签:

【本文来自于喜乐君在知乎的问答】

让CONTEXT变得混乱的几个误区:

  • !!!DAX的row context/Filter context仅仅指计算的位置,而无关计算的分类!
  • !!!普遍的,大家从单元格(cell)的角度理解CONTEXT,不管是Row CONTEXT,还是FILTER CONTEXT
  • !!!FILTER CONTEXT不仅仅包含筛选器,还包括聚合的分组依据(即维度)。

尝试从业务和技术两个角度来理解,先总结几句话:

  • 行上下文、筛选上下文,通俗理解就是数据准备的语境、问题分析的语境;对应计算的两个位置或阶段,注意,不是计算的类型。
  • 计算的两个阶段是:在数据明细行阶段的计算(对应table),在Report或可视化阶段的计算(对应问题);
    • 前者通常是行级别计算(有例外),后者通常是聚合计算(有例外);
    • 行上下文,是相对于数据表明细行级别的计算,所对应的环境;
    • 筛选上下文,是相对于Report或可视化级别的计算,所对应的环境。
  • 如果考虑到计算类型,那么计算就是两两两组合,8种可能性。
    • 计算类型有:聚合计算、非聚合计算,跨行计算、行级别计算两大分类。
    • 行上下文,既可以适用于聚合计算,也可以(主要是)非聚合计算;
    • 筛选上下文,既可以(主要是)适用于聚合计算,也可以适用于非聚合计算。

展开解释:

1、所有的计算都相对于特定的环境、语境(environment/context)而有意义

比如:

  • 【发货日期】-【订单日期】计算“发货间隔”是相对于明细行有意义的(不管是订单,还是交易)
  • SUM(利润)/SUM(销售额) 相对于明细行没有意义,只相对于问题(比如各类别的利润率)才有意义。

2、“计算相对于哪里才有意义”,哪里就是计算的环境、语境(environment/ context)

计算主要由两个环境,一个是数据表明细行,一个是报表(或曰可视化)。 可以画一个图:

3、数据分析中,有两种阶段的计算:

  • 在问题聚合之前的数据表明细行的计算——相对于数据表明细行有意义
  • 在问题聚合及其之后的计算——相对于问题而有意义

4、计算的阶段,不同于计算的类型

简单的问题分析中,左侧(数据准备)都是行级别计算,右侧才有聚合。

但是在复杂问题中,位置和计算是交织的。数据准备中会有聚合(比如客户的频次),问题分析中也会有行级别计算(比如筛选2022年)。

!!!DAX的row context/Filter context仅仅指计算的位置,而无关计算的分类!!

如下所示:

相对于“数据表明细行”有意义的计算,叫“行级别计算”,或者DAX计算列;对应的明细行称之为前者的 ROW CONTEXT——在ROW上计算。

相对于“问题”而有意义的计算,叫“度量计算”,或者DAX 度量值Measure;影响聚合值大小的所有直接要素称之为该计算的 FILTER CONTEXT ,包括:

  • 视图筛选器
  • 视图切片器
  • 视图分组依据(行列维度)
  • CALCULATE中嵌套的筛选条件或分组依据

问答:


Q王强
:我有个问题,假如筛选2022年的各类别销售额,请问这个”2022年“,是不是按明细行逐行进行的判断?算不算是在行上下文内进行的计算?我看到有人说“字段名”=字段值,这个格式的筛选条件时,说字段名是筛选上下文,后面的字段值是行上下文。有点懵了。


A喜乐君
:所有直接影响聚合值大小的,都是filter context,可以是筛选条件(year=2022),可以是分组条件(类别).

同时,区别于类别,年度筛选又确实是在每一行上依次计算的,year(dt)=2022需要在明细表的每一行上完成计算,方可确认对哪些明细行执行分组、聚合。从这个角度看, 这个“2022年”确实是 行级别计算、row context。

二者如何连贯起来?你可以把 year(dt)=2022 的结果 true /false,理解为行级别的计算;而把 从true/false中保留true的过程理解为视图级别的filter context。

说“字段名是筛选上下文,后面的字段值是行上下文”,可能也是想表达这个意思,只是没说清楚……