另一个维度中的LastNonEmpty的MDX计数

时间:2018-01-05 23:09:48

标签: sql-server ssas mdx

我只是MDX的初学者。我手头的问题如下:

我有一个Fact表,其格式大致如下:

enter image description here

我必须创建一个报告,根据报告中的任何日期选择,我们希望查看最后一个TaskStatusID是特定值的任务总数。

例如,根据上述数据,如果用户在报告中选择2017年11月11日和TaskStatus为CLOSED,则应返回一个任务(100),因为11月11日之前的任务ID 100已关闭(第4个) ()行和任务ID 101已完成(最后一行),因此被拒绝。

类似地,如果用户选择2017年11月13日和OPEN,则不应该返回任何内容,因为TaskID 100有3行作为日期,但我们只采用最新的CLOSED而不考虑,类似于TaskID 101的最新版本row(上面数据中的最后一行)是COMPLETED,因此不予考虑。

我已尝试使用2017年11月11日针对总开放任务(TaskStatusID = 2)的自定义最后非空MDX查询解决此问题:

WITH MEMBER Measures.LatestMember AS
TAIL(NONEMPTY({NULL:[Date].[Date].CURRENTMEMBER} * [IsLastInADay].&[1], Measures.CountOfRows))
MEMBER Measures.Count AS
COUNT(NONEMPTY([DimTask].[TaskID].MEMBERS * [DimTaskStatus].[TaskStatusID].&2], Measures.LatestMember))
SELECT 
Measures.Count ON 0,
[Date].[Date].&[20171111] ON 1
FROM [Cube Name] 

但这需要永远执行。我的事实表包含大约4000万行,并且有大约800万个不同的任务,数据分散了10年。

我们将非常感谢任何建议,包括事实表设计的变更或将一些复杂性转移到ETL过程。

谢谢

1 个答案:

答案 0 :(得分:0)

也许这种方法更快?

WITH 
MEMBER Measures.LatestMember AS
TAIL(
  NONEMPTY(
    {NULL:[Date].[Date].CURRENTMEMBER} * [IsLastInADay].&[1]
   , Measures.CountOfRows
  )
)
MEMBER Measures.Count AS
SUM(
  [DimTask].[TaskID].MEMBERS * [DimTaskStatus].[TaskStatusID].&2]
  IIF(
    Not(IsEmpty(Measures.LatestMember))
   ,1
   ,NULL
  )
)
SELECT 
Measures.Count ON 0,
[Date].[Date].&[20171111] ON 1
FROM [Cube Name];