如何根据 mdx 中的另一个维度层次结构过滤维度层次结构

Posted

技术标签:

【中文标题】如何根据 mdx 中的另一个维度层次结构过滤维度层次结构【英文标题】:How to filter a dimension hierarchy based on another dimension hierarchy in mdx 【发布时间】:2015-04-22 14:32:16 【问题描述】:

我有一个发件人和收件人维度,它们是员工物理表之外的角色扮演维度。 我的事实表有发件人、收件人、消息列。 我想从员工那里收到消息,发送给公司中的每个人,除了那些向他的经理报告的人。 我试过这样的东西

WITH 
  SET [Others] AS 
    Except
    (
      Ascendants([Recipient].[Manager])
     ,[Sender].[Manager].Parent
    ) 
SELECT 
  [OTHERS] ON COLUMNS
 ,[Measures].[Messages] ON ROWS
FROM [cube]
WHERE 
  [Sender].[Manager].&[xyz];

基本思想是..获取给定发件人的收件人的所有升迁,并过滤其升迁列表由发件人父级组成的那些。

这不起作用,因为除了两个不同的维度层次结构之间我不能这样做。

【问题讨论】:

好的 - 正如你在这种情况下所说的那样 Except 将不起作用。 【参考方案1】:

尝试通过关键字EXSITING 使Set 更具上下文感知能力,然后使用过滤器比较member_caption

WITH 
  MEMBER [Measures].[SenderName] AS 
    [Sender].CurrentMember.Member_Caption 
  SET [ExistingRecip] AS 
    (EXISTING 
      [Recipient].[Manager].MEMBERS) 
  SET [Others] AS 
    Filter
    (
      [ExistingRecip]
     ,
        [ExistingRecip].Item(
        [ExistingRecip].CurrentOrdinal - 1).Member_Caption
      <> 
        [Measures].[SenderName]
    ) 
SELECT 
  [OTHERS] ON COLUMNS
 ,[Measures].[Messages] ON ROWS
FROM [cube]
WHERE 
  [Sender].[Manager].&[xyz];

【讨论】:

它在 100K 员工表和 26M 事实表上工作,但性能超级慢 Filter 是一个慢函数 - 我认为它是迭代的,mdx 计算引擎在 block mode 中不起作用。我会尝试考虑不同的方法。

以上是关于如何根据 mdx 中的另一个维度层次结构过滤维度层次结构的主要内容,如果未能解决你的问题,请参考以下文章

具有多个属性层次结构的计算成员 - MDX

如何使用蒙德里安聚合单个维度的多个层次结构?

MDX IIF 语句根据度量和层次结构叶计算新成员

如何在 MDX 中对同一维度进行分组和过滤

MDX 排除层次结构中存在值的结果

mondrian mdx 过滤日期维度中年份级别的集合