You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MDX查询中filter()函数与Where子句的区别及适用场景咨询

MDX中Filter()函数与Where子句的区别

核心定位差异

  • Where子句:本质是定义切片器,作用是从多维数据集里"切出"一个子立方体,所有后续计算都基于这个子立方体。它在查询执行的早期阶段生效,过滤的是整个数据集的维度成员,不会改变查询的轴(Rows/Columns)结构。
    示例:

    SELECT 
      [Measures].[Sales Amount] ON COLUMNS,
      [Product].[Category].Members ON ROWS
    FROM [Adventure Works]
    WHERE ([Date].[Calendar Year].[2023])
    

    这里Where直接把数据集限定在2023年,所有行的销售额都是2023年的数据,轴上的产品类别不会被过滤,只是每个类别的值被切片到2023年。

  • Filter()函数:是对指定轴上的成员集合进行过滤,属于行级/列级的筛选,会改变最终返回的轴成员数量。它在切片之后执行,针对已经切片后的数据集,筛选出符合条件的轴成员。
    示例:

    SELECT 
      [Measures].[Sales Amount] ON COLUMNS,
      Filter(
        [Product].[Category].Members,
        [Measures].[Sales Amount] > 100000
      ) ON ROWS
    FROM [Adventure Works]
    WHERE ([Date].[Calendar Year].[2023])
    

    这里先通过Where切片到2023年,再用Filter把销售额超过10万的产品类别筛选出来,最终行轴只保留符合条件的类别。

使用场景区分

  • 选择Where子句的情况:

    • 需要对整个查询的数据集做全局切片,比如限定时间、区域等通用维度,不改变轴上的成员集合。
    • 过滤的是独立于Rows/Columns轴的维度。
    • 追求性能:切片是早期执行,OLAP引擎可提前优化,减少后续计算的数据量。
  • 选择Filter()函数的情况:

    • 需要基于度量值或当前轴成员的属性筛选轴上的成员,比如只保留销售额超过某阈值的产品类别。
    • 过滤的是已经在Rows/Columns轴上的维度成员。
    • 需要复杂条件判断(比如多条件组合、基于其他度量的计算)。

关键注意点

  • Where子句不能用于筛选轴上的成员,比如在Where里写[Product].[Category].[Bikes],只会把整个数据集切片到Bikes类别,行轴仍会显示所有类别,但其他类别对应的值为null。
  • Filter()是逐成员计算,性能通常弱于Where子句,处理大集合时更明显,能通过切片解决的需求优先用Where。

内容的提问来源于stack exchange,提问作者Mantu subudhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:13:14