使用BottomCount()在SSAS中找到25%的中位数

时间:2014-05-15 19:29:14

标签: sql ssas mdx olap-cube

我试图在我的立方体中找到中位数,第25百分位数和第75百分位数。我正在评估的值是不可求的,因为它们代表了人的年龄,所以我使用以下函数来查找中位数:

WITH MEMBER Measures.[Set Median] AS MEDIAN(
    [Dimension].[Key Attribute].MEMBERS
    ,Measures.[Non-summable Measure]
)

维度键和事实表键具有1-1关系,因此作为集合的关键成员允许我在没有任何求和的情况下找到所有返回记录的中值。我使用以下功能组合成功找到了第75个百分点:

MEMBER Measures.[75th Percentile] AS MEDIAN(
    TOPCOUNT(
        [Dimension].[Key Attribute].MEMBERS
        ,Measures.[Fact Table Record Count] / 2
        ,Measures.[Non-summable Measure]
    )
    ,Measures.[Non-summable Measure]
)

由于TopCount按降序对集合进行排序,我可以通过查找记录上半部分的中位数来找到第75百分位数。基于这个逻辑,我试图通过使用BottomCount函数以相同的方式找到第25个Percentile,因为它按升序对集合进行排序。但是,我在第25次Percentile计算的查询中只返回NULL。这是功能组合和我的最终查询:

MEMBER Measures.[75th Percentile] AS MEDIAN(
    BOTTOMCOUNT(
        [Dimension].[Key Attribute].MEMBERS
        ,Measures.[Fact Table Record Count] / 2
        ,Measures.[Non-summable Measure]
    )
    ,Measures.[Non-summable Measure]
)

SELECT
    {
        Measures.[Set Median]
        ,Measures.[25th Percentile]
        ,Measures.[75th Percentile]
    } ON 0
    ,[Date Dimension].[Calendar Hierarchy].Year.&[2011]:[Date Dimension].[Calendar Hierarchy].Year.&[2014] ON 1
FROM [Cube]
WHERE
    [Age Dimension].[Age in Years Hierarchy].[Age Year].&[0]:[Age Dimension].[Age in Years Hierarchy].[Age Year].&[5]

我不明白为什么当使用Median和TopCount函数我遇到第75百分位相反的情况时,我使用Median和BottomCount函数得到第25个百分点的NULL。我已经在SQL数据库中检查了我的数据集,并且我的测量值都不是NULL。如果有人对BottomCount函数有了更好的理解,我感谢任何明确的解释或替代方法来帮助我在MDX中找到正确的第25个百分点。谢谢!

3 个答案:

答案 0 :(得分:1)

而不是 [Dimension]。[Key Attribute] .MEMBERS 看起来这应该有用 - NONEMPTY(LEAVES([Dimension]))

但我尝试了它只是挂起,永远不会返回结果,至少我没有耐心等待超过10分钟

所以我使用了它,它工作得很好 FILTER({LEAVES([Dimension])},Measures。[不可归和的度量]> 0)

这是我的完整查询,它返回正确的第25百分位数

WITH
MEMBER [Measures].[P25] AS  
MEDIAN( BOTTOMCOUNT(
            FILTER({LEAVES([Dimension])}, Measures.CalculatedRate > 0)
            ,[Measures].[Dimension Member Distinct Count] /2 
            ,Measures.[CalculatedRate]
        )
        ,[CalculatedRate]
    )
SELECT
{Region.MEMBERS} ON ROWS,
{[Measures].[P25]} ON COLUMNS
FROM
[Cube]
where
    ( <where clause> )

希望它有所帮助...

答案 1 :(得分:0)

您是否可以将您在第25和第75百分位数的定义中创建的Measures.[Set Median]放入FILTER子句中,以便25日的定义类似于:

MEDIAN(
    FILTER(
        [Dimension].[Key Attribute].MEMBERS, 
        Measures.[Non Summable Measure] < Measures.[Set Median]
    ),
    Measures.[Non Summable Measure]
)

第75届的定义类似,但使用大于号。这里有一些边界问题,因此您可能需要&lt; =或&gt; =。

警告:此查询远不是MDX解析器!

答案 2 :(得分:0)

注意没有百分位数的标准定义,也没有四分位数(Q1和Q3对应于P25和P75)。此查询实现百分位数的一个定义,修改它以匹配您要使用的定义。

让我们根据一个尺度来取一套并订购..

With
  set CUSTOMERS as Order( [Customers].Children), [Measures].[Sales], ASC ) 

我们计算每个集合项目的等级以及集合中元素的总数。

  member [Measures].[Rank] as Rank( [Customers].CurrentMember, CUSTOMERS)
  member [Measures].[Count] as Count( CUSTOMERS )

将第一个除以第二个,我们得到(一个定义)百分位数。

  member [Measures].[Percentile] as [Measures].[Rank] / [Measures].[Count] * 100

要获得第25个百分点,请获取百分位值至少为25的第一个项目

select 
  Head( Filter( CUSTOMERS, [Measures].[Percentile] > 25) ,1) on Rows,
  { [Measures].[Sales], [Measures].[Rank], [Measures].[Count], [Measures].[Percentile]  } on columns
from [MyCube]

此项目的[Measures]。[Sales]值是百分位数。