2

MDXのドキュメントを解釈するコツをまだつかんでいますMSDN。したがって、RANK関数の場合、次のようになります。

数値式が指定されている場合、Rank 関数は、タプルに対して指定された数値式を評価することにより、指定されたタプルの 1 ベースのランクを決定します。数値式が指定されている場合、Rank 関数は、セット内の重複する値を持つタプルに同じランクを割り当てます。重複する値に同じランクを割り当てると、セット内の後続のタプルのランクに影響します。たとえば、集合は {(a,b), (e,f), (c,d)} のタプルで構成されます。タプル (a,b) の値はタプル (c,d) と同じです。タプル (a,b) のランクが 1 の場合、(a,b) と (c,d) の両方のランクは 1 になります。ただし、タプル (e,f) のランクは 3 になります。このセットにはランク 2 のタプルはありません。数値式が指定されていない場合、Rank 関数は、指定されたタプルの 1 から始まる序数の位置を返します。Rank 関数はセットを順序付けしません。

次のスクリプトでは、2 人が最高の給与で 2 番目に並んでいる場合、次の給与ランクが得られます。

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、3 番目の引数なしで使用します。つまり、

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

Rank2 番目の引数であるセット内の最初の引数の位置を返します。3 番目の引数は、同点の値を同じにしたい場合に特に使用されます。3 番目の引数を使用すると、セット内の隣接する要素について、3 番目の引数がチェックされ、戻り値は、3 番目の引数と同じ値を持つセット内の最初の要素の位置になります。

MDX でいくつかの基準で並べ替えるには、2 つの注文を互いに入れ子にします。

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 MDXは安定した並べ替えOrderを行うことが保証されているため、外部並べ替えを実行すると、同じ給与のメンバーは最初の並べ替えから相対的な順序を変更しません。つまり、メンバーは勤続年数で並べ替えられ続けます。

于 2013-09-06T10:01:47.323 に答える