SSAS / MDX在多个时间段内平均

时间:2016-06-20 19:42:22

标签: reporting-services sql-server-2012 ssas mdx

如何在SSAS / MDX查询的同一结果行中获取多个时间范围的平均值?

需求已更改,我作为基于事务数据库的SSRS / SQL过程编写的报告现已移至带有SSAS多维数据集的数据仓库。 SSAS是我的新基础。我花了几天的时间试图通过MDX努力工作,因为我很快意识到拖放方法并不能满足我的需要。

场景:记录大型系统中关键部件和软件过程的性能时间(特别是持续时间,以毫秒为单位)。报告的想法是根据历史优先级显示表现最差的人,并着眼于在用户说“系统运行缓慢"”时找到问题区域。

报告栏:

  • 功能(实际上这里有几列,但我确信一旦我开始工作,我就可以使用它们)
  • 去年的平均持续时间
  • avg持续时间超过1周开始一年前
  • 过去6个月的平均持续时间
  • 平均持续时间超过1周,从6个月前开始
  • 上个月的平均持续时间
  • avg持续时间超过1周开始一个月前
  • 上周的平均持续时间
  • 平均持续时间
  • 平均持续时间选定日
  • %减少 - >这在SSRS中计算为所有平均值的最差差异

简化的多维数据集 - 尝试遵循MS文章中的建议

  • Activities.Duration MS
  • Activities.Activities Count
  • Functions.Fuction Key
  • Functions.Function Desc
  • Dates.Date Key(请注意,Date维度此时没有层次结构)
  • 日期。日期

我得到了以下内容,然后开始使用AVG()函数,但收效甚微。

WITH MEMBER [Measures].[Duration MS Avg] AS [Measures].[Duration Ms]/[Measures].[Activities Count]
SELECT
                     { [Measures].[Duration Ms], [Measures].[Activities Count], [Measures].[Duration MS Avg] } ON COLUMNS, 
                     { ([Functions].[Function Desc].[Function Desc].ALLMEMBERS )} ON ROWS 
FROM ( SELECT ( {[Dates].[Date Date].&[2016-05-24T00:00:00]} ) ON COLUMNS 
FROM [DW]) 
WHERE ( [Dates].[Date Date].&[2016-05-24T00:00:00] )

这种查询是否可行?我在滥用SSAS吗?

1 个答案:

答案 0 :(得分:1)

随着时间层次的增加,沿着日期“旅行”更加困难。

但是这里有一个简单的例子,可以作为一个例子。

WITH 
MEMBER [Measures].[Duration MS Avg] 
AS 
DIVIDE(
    [Measures].[Duration Ms]
    ,[Measures].[Activities Count]
)
MEMBER [Measures].[Duration MS Avg Over Last Day]
AS
DIVIDE(
    (
        [Dates].[Date Date].CURRENTMEMBER.LAG(1)
        ,[Measures].[Duration Ms]
    )
    ,(
        [Dates].[Date Date].CURRENTMEMBER.LAG(1)
        ,[Measures].[Activities Count]
    )
)
MEMBER [Measures].[Duration MS Avg Over Last Week]--Last 7 days
AS
DIVIDE(
    AGGREGATE(
        [Dates].[Date Date].CURRENTMEMBER.LAG(7):[Dates].[Date Date].CURRENTMEMBER
        ,[Measures].[Duration Ms]
    )
    ,AGGREGATE(
        [Dates].[Date Date].CURRENTMEMBER.LAG(7):[Dates].[Date Date].CURRENTMEMBER
        ,[Measures].[Activities Count]
    )
)
SELECT
{ 
    [Measures].[Duration Ms], 
    [Measures].[Activities Count], 
    [Measures].[Duration MS Avg],
    [Measures].[Duration MS Avg Over Last Week]
} ON COLUMNS, 
{ 
    (
        [Functions].[Function Desc].[Function Desc].ALLMEMBERS 
    )
} ON ROWS 
FROM ( 
    SELECT 
        ( {[Dates].[Date Date].&[2016-05-24T00:00:00]} ) ON COLUMNS 
    FROM [DW]
) 
WHERE 
    ( [Dates].[Date Date].&[2016-05-24T00:00:00] )