2

仍然掌握解释MDX. MSDN因此,对于该RANK功能,它具有以下内容:

如果指定了数值表达式,Rank 函数通过针对元组评估指定的数值表达式来确定指定元组的从一开始的排名。如果指定了数值表达式,Rank 函数将相同的等级分配给集合中具有重复值的元组。将相同等级分配给重复值会影响集合中后续元组的等级。例如,一个集合由以下元组组成,{(a,b), (e,f), (c,d)}。元组 (a,b) 与元组 (c,d) 具有相同的值。如果元组 (a,b) 的等级为 1,则 (a,b) 和 (c,d) 的等级均为 1。但是,元组 (e,f) 的等级为 3。此集合中可能没有排名为 2 的元组。如果未指定数值表达式,Rank 函数返回指定元组的从一开始的序数位置。Rank 函数不对集合进行排序。

在下面的脚本中,如果两个人的最高薪水并列第二,我会得到以下薪水等级:

1
2
2
4

我想做的是用服务年限来决定哪个被捆绑的人的等级更高。这可能吗?

WITH 
    SET [OrderedPeople] AS 
        ORDER(
            NONEMPTY(
                [PeopleDimension].[PeopleHier].[NamesLevel].members,
                { //following means if one or the other is null 
                  //then the row is not excluded
                [Measures].[Salary],
                [Measures].[NumYearsService]
                }
            ),
            [Measures].[Salary]
            *
            [Measures].[NumYearsService]
            , 
            BDESC
            )
    MEMBER [Measures].[Salary_Rank] AS 
        RANK([PeopleDimension].[PeopleHier].CurrentMember,
            [OrderedPeople],
            [Measures].[Salary] //<<<how do I use numYearsService to decide ties?
            )
SELECT 
    NON EMPTY 
        { 
        [Measures].[NumYearsService],       
        [Measures].[Salary],
        [Measures].[Salary_Rank]             
        }
    ON COLUMNS,

    NON EMPTY 
        [OrderedPeople]
    ON ROWS  

FROM [ourCube]
WHERE   
    (
    {TAIL([Date].[Date - Calendar Month].[Calendar Day],7)(0):
    TAIL([Date].[Date - Calendar Month].[Calendar Day],7)(6)}
    )
4

1 回答 1

3

如果您已经订购了该集合,则可以Rank不使用第三个参数,即

RANK([PeopleDimension].[PeopleHier].CurrentMember,
     [OrderedPeople]
)

Rank返回第一个参数在作为第二个参数的集合中的位置。第三个参数专门用于您希望关系获得相同值的情况。如果使用第三个参数,则对于集合中的相邻元素,检查第三个参数,返回值是集合中与第三个参数具有相同值的第一个元素的位置。

要在 MDX 中按多个条件排序,请将两个订单相互嵌套:

ORDER(
   ORDER(
        NONEMPTY(
            [PeopleDimension].[PeopleHier].[NamesLevel].members,
            { //following means if one or the other is null 
              //then the row is not excluded
            [Measures].[Salary],
            [Measures].[NumYearsService]
            }
        ),
        [Measures].[NumYearsService]
        , 
        BDESC
    ),
    [Measures].[Salary],
    BDESC
)

AS MDXOrder保证做一个稳定的排序,当执行外部排序时,具有相同薪水的成员不会改变他们从第一个排序开始的相对顺序,这意味着他们继续按服务年限排序。

于 2013-09-06T10:01:47.323 回答