【问题标题】:Filtering a Measure (or Removing Outliers)过滤度量(或删除异常值)
【发布时间】:2009-11-20 15:37:03
【问题描述】:

假设我在一个多维数据集中有一个度量 foo,并且我有一个报告要求,即用户希望在报告中看到以下度量:

total foo
total foo excluding instances where foo > 10
total foo excluding instances where foo > 30

处理此问题的最佳方法是什么? 过去,我添加了命名计算,如果 foo > 10 则返回 NULL,否则返回 foo。 我觉得必须有一种方法可以在 MDX 中实现这一点(类似于Filter([Measures].[foo], [Measures].[foo] > 10)),但我一辈子都想不通。

有什么想法吗?

【问题讨论】:

    标签: mdx cube cubes


    【解决方案1】:

    诀窍是您需要在您的集合上应用过滤器,而不是在您的度量上。

    例如,使用通常的 Microsoft“仓库和销售”演示立方体,以下 MDX 将显示销售额超过 2000 美元的所有商店的销售额。

    SELECT Filter([Store].[Stores].[Store].members, [Unit Sales] > 2000) ON COLUMNS, [单位销售] ON ROWS FROM [仓库和销售]

    【讨论】:

    • 感谢您的意见,这根本不是我想要的效果。您的示例过滤了一组商店,但我正在寻找的是一种过滤事实记录的方法。使用您的示例,假设我想显示每家商店的平均单位销售额,我仍然想显示每家商店,但我不希望平均总销售额 > 2000。
    【解决方案2】:

    我在使用saiku(使用Mondrain的后端)时遇到了类似的问题,因为我还没有找到任何明确的“在度量上添加过滤器”的解决方案,我在这里添加了它,这可能对其他人有用。

    在Saiku3.8中,你可以在UI上添加过滤器:“column”->“filter”->“custom”,然后你可能会看到一个Filter MDX Expression。

    假设我们希望广告中的点击次数大于 1000,然后在此处添加以下行:

    [Measures].[clicks] > 1000
    

    保存并关闭,那么该过滤器将对点击次数大于 1000 的 find elem 有效。

    MDX like below(假设dt为维度,点击为度量,我们要找到点击次数超过1000的dt)

    WITH
    SET [~ROWS] AS
        Filter({[Dt].[dt].[dt].Members}, ([Measures].[clicks] > 1000))
    SELECT
    NON EMPTY {[Measures].[clicks]} ON COLUMNS,
    NON EMPTY [~ROWS] ON ROWS
    FROM [OfflineData]
    

    【讨论】:

    • 谢谢。它工作得很好。我有兴趣在名为 SoldQty 的度量上放置一个过滤器,并希望允许最终用户在 SSRS 报告中将此过滤器用作报告参数。 WITH SET [~ROWS] AS Filter({[Dt].[dt].[dt].Members}, ([Measures].[clicks] > STRTOVALUE(@SoldQty))) SELECT NON EMPTY {[Measures].[点击]} 列,非空 [~ROWS] 来自 [OfflineData] 的行
    【解决方案3】:

    我认为你有两个选择:

    1- 将列添加到您的事实(或基于事实表的数据源视图上的视图),例如:

    case when unit_Price>2000 then 1 
         else 0  
    end as Unit_Price_Uper_Or_Under_10 
    

    并根据此列值添加一个虚构的维度。 并为新维度添加命名查询(比如 datasourceview 中的 Range_Dimension : 选择 1 作为范围 联合所有 选择0作为范围

    之后你就不能像其他维度和属性一样使用这个过滤器了。

     SELECT [Store].[Stores].[Store].members ON COLUMNS,
    [Unit Sales] ON ROWS
    FROM [Warehouse and Sales]
    WHERE [Test_Dimension].[Range].&[1]
    

    问题是对于每个范围,您必须添加When 条件,并且仅当范围是静态的时,此解决方案才是一个好的解决方案。 对于动态范围,最好制定范围(基于离散化方法)

    2-基于事实表在事实表附近添加粒度维度 例如,如果我们有主键Sale_id的事实表。我们可以添加 基于事实表的维度,只有一列 sale_Iddimension Usage tab 我们可以将此new dimensionmeasure group 与关系类型Fact 和 之后在 mdx 中我们可以使用类似的东西:

    filter([dim Sale].[Sale Id].[Sale Id].members,[Measures].[Unit Price]>2000)
    

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多