我只是MDX的初学者。我手头的问题如下:
我有一个Fact表,其格式大致如下:
我必须创建一个报告,根据报告中的任何日期选择,我们希望查看最后一个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过程。
谢谢
答案 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];