考虑并列排名

Account for tied ranks

我正在使用以下内容:

WITH 
  SET [myset] AS 
    Order
    (
      {
          [Customer].[Country].[Country].MEMBERS
        * 
          [Customer].[Customer].[Customer].MEMBERS
      }
     ,[Measures].[Internet Sales Amount]
     ,ASC
    ) 
  MEMBER [Measures].[rank] AS 
    Rank
    (
      (
        [Customer].[Country].CurrentMember
       ,[Customer].[Customer].CurrentMember
      )
     ,[myset]
    ) 
  MEMBER [Measures].[newrank] AS 
    IIF
    (
        [myset].Item(
        [Measures].[rank] - 1).Item(0).Name
      <> 
        [myset].Item(
        [Measures].[rank] - 2).Item(0).Name
     ,1
     ,
      ([myset].Item([Measures].[rank] - 2),[Measures].[newrank]) + 1
    ) 
SELECT 
  {
    [Measures].[Internet Sales Amount]
   ,[Measures].[rank]
   ,[Measures].[newrank]
  } ON 0
 ,[myset] ON 1
FROM [Adventure Works];

这是 Amish Shah 的作品:http://blog.sqltechie.com/2010/03/rank-with-partitioning-mdx.html

目前它不给具有相同值的元组相同的等级,例如如果 x 的 Internet Sales Amount 为 10,而 y 也为 10,则在上面它们的排名将不同。

是否可以更改以上内容,以便如果它们具有相同的值,那么它们对于 [Measures].[rank] 具有相同的值 - 并且对于 [Measures].[newrank] 也具有相同的值?

(将第三个参数添加到 [Measures].[rank] 的定义中似乎不是继续进行的可能途径,因为 Rank 函数随后进入逐个单元的计算模式)

像这样使用递归计算成员如何 -

WITH 
  SET [myset] AS 
    Order
    (
      {
          [Customer].[Country].[Country].MEMBERS
        * 
          [Customer].[Customer].[Customer].MEMBERS
      }
     ,[Measures].[Internet Sales Amount]
     ,ASC
    ) 
  MEMBER [Measures].[myrank] AS 
    Rank
    (
      (
        [Customer].[Country].CurrentMember
       ,[Customer].[Customer].CurrentMember
      )
     ,[myset]
    ) 


member prevmembervalue as 
(myset.item(myRank - 2), [Measures].[Internet Sales Amount])

member currentmembervalue as
(myset.item(myRank - 1), [Measures].[Internet Sales Amount])

MEMBER greaterthanprev as
iif(currentmembervalue > prevmembervalue, 1, 0)

member rankActual as
iif
(
 prevmembervalue = null, 1,
 iif(currentmembervalue > prevmembervalue,
  (myset.item(myRank - 2), rankActual) + 1,
  (myset.item(myRank - 2), rankActual)
 )
 )

select myset on 1,
{[Measures].[Internet Sales Amount], rankActual, myRank}
on 0
from 
[Adventure Works]

措施greaterthanprevcurrentmembervalueprevmembervalue实际上是不需要的。将它们添加到此处只是为了对流程进行一些补充说明。