请求协助编写MDX查询:计算指定日期范围内的平均值
没问题,我来帮你搞定这个MDX查询的需求!咱们一步步来拆解实现方式,包括你关心的IFF语句用法~
MDX查询实现指定日期范围的平均值
你的需求是基于时间维度的起始日期,计算「起始日期-13天」到「起始日期」这个范围内的度量平均值,下面是具体实现方案:
一、基础版MDX查询实现
假设你的时间维度为[Date].[Date],需要计算的度量是[Measures].[TargetMetric](替换成你实际的度量名称),我们可以直接用Avg函数结合日期集来实现:
WITH MEMBER [Measures].[14-Day Average] AS Avg( -- 构建日期范围:从当前日期往前推13天,到当前日期的连续日期集 {[Date].[Date].CurrentMember.Lag(13) : [Date].[Date].CurrentMember}, [Measures].[TargetMetric] ) SELECT -- 展示原始度量和计算出的平均值 {[Measures].[TargetMetric], [Measures].[14-Day Average]} ON COLUMNS, -- 选择需要查询的日期范围(示例为最近30天) [Date].[Date].[Date].Members.Item(0).Lag(29) : [Date].[Date].[Date].Members.Item(0) ON ROWS FROM [YourCubeName] -- 替换为你的立方体名称
代码说明:
[Date].[Date].CurrentMember.Lag(13):获取当前行日期往前推13天的维度成员::用来定义两个成员之间的连续日期集(前提是你的时间维度是自然有序的,通常日期维度默认满足)Avg:对这个日期集内的度量值直接求平均
如果你的时间维度有层级(比如年-月-日),可以把[Date].[Date]替换为对应层级,比如[Date].[Calendar].[Date]。
二、用IFF语句优化边界场景
当然可以用IFF语句来实现,主要用来处理边界日期的异常情况——比如当起始日期是时间维度的最早日期时,往前推13天的成员不存在,这时候可以通过IFF做条件判断,返回合理的结果:
WITH MEMBER [Measures].[14-Day Average] AS IFF( -- 判断当前日期往前13天的成员是否存在 [Date].[Date].CurrentMember.Lag(13) IS NOT NULL, -- 存在则计算完整14天的平均值 Avg( {[Date].[Date].CurrentMember.Lag(13) : [Date].[Date].CurrentMember}, [Measures].[TargetMetric] ), -- 不存在则计算从维度最早日期到当前日期的平均值(也可改为返回NULL/0,按需调整) Avg( {[Date].[Date].[Date].Members.Item(0) : [Date].[Date].CurrentMember}, [Measures].[TargetMetric] ) ) SELECT {[Measures].[TargetMetric], [Measures].[14-Day Average]} ON COLUMNS, [Date].[Date].[Date].Members ON ROWS FROM [YourCubeName]
另外,如果你需要在计算平均值时过滤特定日期(比如排除周末),也可以把IFF嵌入到Avg的参数中:
WITH MEMBER [Measures].[14-Day Average (Exclude Weekends)] AS Avg( {[Date].[Date].CurrentMember.Lag(13) : [Date].[Date].CurrentMember}, IFF( -- 假设日期维度有IsWeekend属性,判断是否为周末 [Date].[Date].CurrentMember.Properties("IsWeekend") = "True", NULL, -- 周末不参与平均值计算 [Measures].[TargetMetric] ) ) SELECT {[Measures].[TargetMetric], [Measures].[14-Day Average (Exclude Weekends)]} ON COLUMNS, [Date].[Date].[Date].Members.Item(0).Lag(29) : [Date].[Date].[Date].Members.Item(0) ON ROWS FROM [YourCubeName]
注意事项
- 确保你的时间维度是连续且有序的,否则
:操作符可能返回错误的日期集 - 所有占位符(比如
[YourCubeName]、[Measures].[TargetMetric])记得替换成你实际的立方体、度量和维度名称 - 如果你的需求是「起始日期-13天」到「起始日期-1天」(不含起始日期),只需把
Lag(13) : CurrentMember改成Lag(13) : CurrentMember.Lag(1)即可
内容的提问来源于stack exchange,提问作者SKenneth
相关产品推荐
相关产品推荐

