考虑并列排名
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]
措施greaterthanprev
、currentmembervalue
和prevmembervalue
实际上是不需要的。将它们添加到此处只是为了对流程进行一些补充说明。
我正在使用以下内容:
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]
措施greaterthanprev
、currentmembervalue
和prevmembervalue
实际上是不需要的。将它们添加到此处只是为了对流程进行一些补充说明。