Ssas MDX-如何基于事实表中连续天数的存在来计算维度?

Ssas MDX-如何基于事实表中连续天数的存在来计算维度?,ssas,mdx,Ssas,Mdx,我需要得到符合两个标准的学生数量: 在最近3个上学日连续缺席3次,或 在过去2个月内没有连续缺席5次。 我有学生每天缺席的事实,包括以下字段: 学生 学校日历ID 学生 ClassId QtyAbsents始终为1,仅用于求和 尺寸: 迪姆学生 学校日历 迪姆学校 迪姆class 我做了一个MDX,返回符合第一个条件的学生姓名: 具有 成员[A]AS 案例 当[Measures].[QtyLackingStudents]=3时 然后“三次连续缺席”否则无效结束 选择 列上的非空{[A]}, 行上

我需要得到符合两个标准的学生数量:

在最近3个上学日连续缺席3次,或 在过去2个月内没有连续缺席5次。 我有学生每天缺席的事实,包括以下字段:

学生 学校日历ID 学生 ClassId QtyAbsents始终为1,仅用于求和 尺寸:

迪姆学生 学校日历 迪姆学校 迪姆class 我做了一个MDX,返回符合第一个条件的学生姓名:

具有 成员[A]AS 案例 当[Measures].[QtyLackingStudents]=3时 然后“三次连续缺席”否则无效结束 选择 列上的非空{[A]}, 行上的非空{[DimStudent].[Name].ALLMEMBERS} 从…起 选择 滤器 [DimSchoolCalendar][Date]。成员, [DimSchoolCalendar].[Date].CURRENTMEMBER.NAME=VBAMDX!格式化VBAMDX!现在,yyyy-MM-dd .ITEM0.Lag3:过滤器 [DimSchoolCalendar][Date]。成员, [DimSchoolCalendar].[Date].CURRENTMEMBER.NAME=VBAMDX!格式化VBAMDX!现在,yyyy-MM-dd .列上的项目0 从…起 选择 列上的{[DimSchoolCalendar].[SchoolDay].&[IsSchoolDay]} 来自【AlunosMatriculados】 但我既不能做第二个标准,也不能把一切都放在一个单一的尺度上

编辑:

我创建了一个返回所需内容的SQL。我需要MDX

选择CountF.StudentId 来自DW.FACTLACKINGF e.SchoolId=f.SchoolId上的内部连接DW.DimSchool e ce上的内部联接DW.DimSchoolCalendar ce.SchoolCalendarId=f.SchoolCalendarId 其中选择COUNT* 来自DM.FactLackingF2 内连接 选择c.SchoolCalendarId ,按c.年份,按c.日期,按c.学校ID订单,按c.日期说明,按顺序 来自dm.DimCalendarioEscolar c 其中c.年=a.年 c.SchoolKey=e.SchoolKey 和c.Date 第一个标准

创建一个日期集,其中从一开始到今天的所有日期:

{NULL:StrToMember('[DimSchoolCalendar].[Date].&[' + Format(Now(),'yyyy-MM-dd') + ']')}
使用IsSchoolDay交叉加入集合,以便只获得上学日:

[DimSchoolCalendar].[SchoolDay].&[IsSchoolDay] * {NULL:StrToMember('[DimSchoolCalendar].[Date].&[' + Format(Now(),'yyyy-MM-dd') + ']')}
从集合中获取最后三个成员:

Tail(               
    [DimSchoolCalendar].[SchoolDay].&[IsSchoolDay] * {NULL:StrToMember('[DimSchoolCalendar].[Date].&[' + Format(Now(),'yyyy-MM-dd') + ']')},
    3
)
创建计算的度量值:

SUM(    
    Tail(           
        [DimSchoolCalendar].[SchoolDay].&[IsSchoolDay] * {NULL:StrToMember('[DimSchoolCalendar].[Date].&[' + Format(Now(),'yyyy-MM-dd') + ']')},
        3
    ),
    [Measures].[QtyLackingStudents]
)
SUM(    
    LastPeriods(
        2,
        StrToMember('[DimSchoolCalendar].[Month].&[' + Format(Now(),'yyyy-MM') + ']')
    ),
    [Measures].[QtyLackingStudents]
)
第二个标准

获取当前月份:

StrToMember('[DimSchoolCalendar].[Month].&[' + Format(Now(),'yyyy-MM') + ']')
获取最后两个月:

LastPeriods(
    2,
    StrToMember('[DimSchoolCalendar].[Month].&[' + Format(Now(),'yyyy-MM') + ']')
)
创建计算的度量值:

SUM(    
    Tail(           
        [DimSchoolCalendar].[SchoolDay].&[IsSchoolDay] * {NULL:StrToMember('[DimSchoolCalendar].[Date].&[' + Format(Now(),'yyyy-MM-dd') + ']')},
        3
    ),
    [Measures].[QtyLackingStudents]
)
SUM(    
    LastPeriods(
        2,
        StrToMember('[DimSchoolCalendar].[Month].&[' + Format(Now(),'yyyy-MM') + ']')
    ),
    [Measures].[QtyLackingStudents]
)
最终结果


这正是我想要的。谢谢不幸的是,自2010年以来,我们有100万学生和320万会员在DimSchoolCalendar上,1100所学校中的每一所每天都有一名学生和320万会员,因此交叉连接操作太糟糕了。就在我被一个学生过滤的时候,我可以尝试。如果你有死去的学生,我的意思是根本没有记录,或者僵尸学生暂时没有记录,你可以过滤掉他们。例如,非空的[DimStudent].[Name].[Name].Members,[Measures].[QtyLackingStudents]将只返回至少缺席一次的学生,因此不需要返回所有学生。您可以使用一些优化,但它们有点棘手。请随意提出新的优化问题。请注意,在我们帮助您之前,您应该提供有关DWH和源的更多信息。