MS SSAS中基于元组集与最大MurexId创建MDX计算成员的问题
正确MDX写法及思维转换说明
问题根源
你之前的错误在于直接在维度元组中使用聚合函数MAX——MDX的元组要求是具体的维度成员,而MAX这类聚合函数返回的是计算值,不能直接作为元组的组成部分。
正确MDX实现(贴合需求)
以下写法会在Book和Instrument层级下,针对回购(REPO)产品,找到对应最大MurexId的交易,再取出其RepoRate_MAX值:
WITH MEMBER [Measures].[RepoRate_VAL] AS // 仅针对回购产品进行计算 CASE WHEN [Deal].[ProductType].CurrentMember IS [Deal].[ProductType].&[REPO] THEN // 在当前Book+Instrument的上下文里,取MurexId最大的交易成员 ( TopCount( [Deal].[MurexId].Members, 1, [Deal].[MurexId].MemberValue // 按MurexId的实际值排序取最大 ).Item(0), [Measures].[RepoRate_MAX] ) ELSE NULL END SELECT {[Measures].[RepoRate_VAL], [Measures].[RepoRate_MAX]} ON COLUMNS, // 按账册和工具维度展开行 NON EMPTY [Deal].[Book].[Book].Members * [Deal].[Instrument].[Instrument].Members ON ROWS FROM [YourCubeName] // 替换成你的多维数据集名称 WHERE [Deal].[ProductType].&[REPO]
关键逻辑解释
- TopCount的作用:替代你Java中取最大MurexId的逻辑——在当前
Book和Instrument的上下文范围内,筛选出1个MurexId值最大的交易成员。 - 元组的正确用法:把TopCount返回的具体交易成员(最大MurexId)和
RepoRate_MAX度量组合成元组,才能正确取出对应维度下的度量值。 - 上下文限定:通过WHERE子句或CASE语句限定仅处理回购产品,避免无效计算。
Java到MDX的思维转换提示
- Java是逐实例/逐行的过程式处理:循环每个Book→每个Instrument→遍历交易找最大MurexId→取Rate。
- MDX是多维上下文的聚合式处理:先确定当前维度的上下文(行轴的Book+Instrument,WHERE的ProductType),再在这个上下文范围内聚合找到目标成员,最后关联度量值。
- 不要试图把MDX的元组当作Java的对象属性来拼接,元组的每个元素必须是维度的具体成员,聚合函数的作用是生成集合或计算值,而非直接作为元组元素。
内容的提问来源于stack exchange,提问作者TilleyTech
相关产品推荐
相关产品推荐

