过滤度量(或删除异常值)
Posted
技术标签:
【中文标题】过滤度量(或删除异常值)【英文标题】: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))
,但我一辈子都想不通。
有什么想法吗?
【问题讨论】:
【参考方案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 的度量上放置一个过滤器,并希望允许最终用户在 s-s-rS 报告中将此过滤器用作报告参数。 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_Id
和 dimension Usage tab
我们可以将此new dimension
和measure group
与关系类型Fact
和
之后在 mdx 中我们可以使用类似的东西:
filter([dim Sale].[Sale Id].[Sale Id].members,[Measures].[Unit Price]>2000)
【讨论】:
以上是关于过滤度量(或删除异常值)的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间?
如何删除 Python boxplot 图形图像中的异常值?