首页 > 解决方案 > 具有时间序列的 SSAS MDX 中位数

问题描述

我正在尝试计算时间序列监控数据的中位数。

OLAP 多维数据集有一个日期维度(最低级别是日期)和一个单独的时间维度。(最低级别是分钟)

我发现它可以正确计算给定日期,但它会汇总当月的值。(这个月应该是~1.55)

WITH MEMBER [Measures].[Medianx] AS MEDIAN([Time].[Time Key].MEMBERS , [Measures].[Total of Values])      

SELECT NON EMPTY {
[Measures].[Count of Values], 
[Measures].[Minimum Value], 
[Measures].[Maximum Value], 
[Measures].[Total of Values], 
[Measures].[Medianx]
} ON COLUMNS,  

NON EMPTY ( [Date].[Date].[Date].MEMBERS )  ON ROWS 

FROM [Environmental Data]

给出了这个:

在此处输入图像描述

本月的中位数不能高于 5 天的中位数。

如何让 OLAP 在汇总时选择的时间范围内正确计算中位数?(例如按日年)

这可能是由具有单独的日期和时间维度引起的吗?

编辑:我发现如果我只是一个退化的维度,wihc 与事实有 1:1 的关系。它计算正确的月份,但真的很慢。(1429 行数据需要 2 分 30 秒)

WITH MEMBER [Measures].[Medianx] AS MEDIAN([Data Attributes].[DETL Key].MEMBERS, [Measures].[Total of Values])

但是,如果我尝试按天查询分组,它永远不会完成查询。

标签: sql-serverssasmdxmedianmdx-query

解决方案


我发现我可以使用 DESCENDANTS 函数来深入了解日期和时间维度,以获得每天 1 分钟粒度的平均聚合。

MEDIAN(NonEmptyCrossJoin(DESCENDANTS([Date].[Calendar Date].CurrentMember, , LEAVES), DESCENDANTS([Time].[Time Key].CurrentMember, , LEAVES)), [Measures].[Average Value])

测试发现,根据数据的性质,每分钟的平均值给出了可靠的中位数。因为它是根据聚合而不是原始数据计算的,所以运行速度非常快。

我真的不明白为什么,但它现在可以正确计算日、月和年。

警告:如果我选择一个月中的 5 天,我将获得每天的正确中位数,并且我将获得整个月的正确中位数。(而不是所选 5 天的中位数)。


推荐阅读