【问题标题】:MDX: efficient way to filter tuples where particular columns are not empty?MDX:过滤特定列不为空的元组的有效方法?
【发布时间】:2013-05-09 20:18:02
【问题描述】:

假设我有一个这样的 MDX 查询:

SELECT Measure1, Measure2, Measure3 ON COLUMNS
[Region].[Region].[Region] ON ROWS
FROM TheCube

如果我想排除所有三个度量都为空的行,我会使用 SELECT NON EMPTY,它工作得很快。但我实际上需要排除 Measure1 和 Measure2 都为空的行,即使 Measure3 有一个值 - 因为在这个特定的多维数据集中 Measure3 总是有一个值,所以 NON EMPTY 根本没有效果。

我可以

SELECT Measure1, Measure2, Measure3 ON COLUMNS
FILTER ([Region].[Region].[Region], 
       NOT (IsEmpty(Measure1) AND IsEmpty(Measure2)) ON ROWS
FROM TheCube

它甚至可以工作,但它需要很长时间:比上面的 NON EMPTY 查询长一个数量级。事实上,即使我通过一个始终为真的表达式进行过滤,比如 FILTER(..., 1=1),它也需要很多时间。

有没有更有效的方法来过滤掉 Measure1 和 Measure2 都为空的行?

【问题讨论】:

    标签: ssas mdx


    【解决方案1】:

    我认为您正在寻找类似的功能 NonEmpty。 http://msdn.microsoft.com/en-us/library/ms145988.aspx 这是他们之间的一个很好的解释:http://thatmsftbiguy.com/nonemptymdx/

    【讨论】:

    • 我见过 NonEmpty()。 100 万美元的问题是我如何用它编写 SELECT,即如何在 NonEmpty 的结果中再添加一列。你能举个例子吗? PS。实际上,我没有意识到 NonEmpty() 有第二个参数。这可能会导致我想要的。但是仍然欢迎举个例子。
    • 好吧,对 NonEmpty() 进行更多调查,它实际上在第一个和第二个参数之间进行了 CROSS JOIN,因此将两组措施传递给它是行不通的。有人可能会尝试在行轴上使用 NonEmpty() 子句和一些度量,但这会忽略任何过滤和什么不是,因此也是有问题的。还在想办法……
    • NonEmpty() 和 WHERE 子句一起解决了问题。如 SELECT Measure1, Measure2, Measure3 ON COLUMNS NonEmpty([Region].[Region].[Region], { [Measure1], [Measure2] }) ON ROWS WHERE - 一些过滤器。如果你不使用 WHERE,你必须非常小心地检查你的 NonEmpty() 到底运行在什么地方。
    【解决方案2】:

    只需以更易读的方式重新输入结果查询:

    SELECT Measure1, Measure2, Measure3 ON COLUMNS
    NonEmpty([Region].[Region].[Region], 
             { [Measure1], [Measure2] }) ON ROWS
    WHERE -- some filter

    如果你不使用 WHERE,你必须非常小心地检查你的 NonEmpty() 运行在什么地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多