【问题标题】:using BottomCount() to find 25th percentile median in SSAS使用 BottomCount() 在 SSAS 中查找第 25 个百分位数中位数
【发布时间】:2014-05-15 19:29:13
【问题描述】:

我试图在我的多维数据集中找到中位数、第 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 个百分位数,因为它按升序对集合进行排序。但是,对于第 25 个百分位计算,我只在查询中返回 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 函数返回 NULL。我检查了 SQL 数据库中的数据集,我的度量值都不是 NULL。如果有人对 BottomCount 函数有更好的理解,我感谢任何清晰的解释或替代方法来帮助我在 MDX 中找到正确的 25th Percentile。谢谢!

【问题讨论】:

  • 首先,有不止一种百分位数可用。你确定你想要哪一个了吗?接下来,为什么数字代表年龄这一事实会使它们无法求和?
  • 百分位数是指在该人口百分比点发现的中位数。例如,正常中位数是第 50 个百分位数。关于不可求和的年龄,我不会在报告中使用 3,000 人的年龄总和,因为它没有用,但中位年龄以及各个百分位点的中值可能有用。百分位数是我们的统计学家使用的术语,所以希望我在这里正确使用它。
  • 几年前我尝试过类似的事情并放弃了 - MDX 是如此晦涩难懂。我更喜欢 SQL 解决方案,例如sqlmag.com/sql-server-2012/…(如果您有 SQL 2012+,请参阅解决方案 2 或解决方案 3)。

标签: sql ssas mdx olap-cube


【解决方案1】:

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

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

所以我改用这个,效果很好 FILTER({LEAVES([Dimension])},Measures.[Non-summable Measure]> 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> )

希望对你有帮助...

【讨论】:

    【解决方案2】:

    您能否使用您在第 25 个和第 75 个百分位的定义中创建的 Measures.[Set Median],将其放入 FILTER 子句中,使第 25 个的定义类似于:

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

    75th 的定义类似,但使用大于号。这里存在一些边界问题,因此您可能需要 =。

    警告:此查询与 MDX 解析器相去甚远!

    【讨论】:

      【解决方案3】:

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

      让我们拿一组并根据度量对其进行排序..

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

      我们计算每个集合项的Rank和集合中元素的总数。

        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]值为百分位数。

      【讨论】:

        猜你喜欢
        • 2020-08-07
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        相关资源
        最近更新 更多