SSAS/MDX 多个时间段的平均值
SSAS/MDX averages over multiple time periods
如何在 SSAS/MDX 查询的同一结果行中获取多个时间范围的平均值?
要求已更改,我作为基于事务数据库的 SSRS/SQL 过程编写的报告现在已移至具有 SSAS 多维数据集的数据仓库。 SSAS 对我来说是新领域。在快速意识到拖放方法无法满足我的需求后,我花了几天时间尝试通过 MDX 工作。
场景:记录大型系统中软件的关键部分和进程的性能时间(具体持续时间以毫秒为单位)。该报告的想法是根据历史优先顺序显示表现最差的人,着眼于在用户说 "the system is running slow".
时发现有问题的区域
报告栏目:
- 功能(这里实际上有几列,但我相信一旦我开始使用它们,我就可以使用它们)
- 去年的平均持续时间
- 从一年前开始的 1 周内的平均持续时间
- 过去 6 个月的平均持续时间
- 从 6 个月前开始,超过 1 周的平均持续时间
- 上个月的平均持续时间
- 从一个月前开始的 1 周内的平均持续时间
- 上周平均持续时间
- 过去一天的平均持续时间
- 选定日期的平均持续时间
- % 减少 -> 这是在 SSRS 中计算的所有平均值之间的最差差异
简化的多维数据集 - 尝试遵循 MS 文章中的建议
- Activities.Duration 女士
- Activities.Activities 计数
- Functions.Fuction键
- Functions.Function描述
- Dates.Date 键(注意此时日期维度没有层次结构)
- Dates.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 吗?
随着时间层次结构的出现,"travel" 沿着日期变得更加困难。
但是这里有一个简单的例子,你想要作为例子的 2 个措施。
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] )
如何在 SSAS/MDX 查询的同一结果行中获取多个时间范围的平均值?
要求已更改,我作为基于事务数据库的 SSRS/SQL 过程编写的报告现在已移至具有 SSAS 多维数据集的数据仓库。 SSAS 对我来说是新领域。在快速意识到拖放方法无法满足我的需求后,我花了几天时间尝试通过 MDX 工作。
场景:记录大型系统中软件的关键部分和进程的性能时间(具体持续时间以毫秒为单位)。该报告的想法是根据历史优先顺序显示表现最差的人,着眼于在用户说 "the system is running slow".
时发现有问题的区域报告栏目:
- 功能(这里实际上有几列,但我相信一旦我开始使用它们,我就可以使用它们)
- 去年的平均持续时间
- 从一年前开始的 1 周内的平均持续时间
- 过去 6 个月的平均持续时间
- 从 6 个月前开始,超过 1 周的平均持续时间
- 上个月的平均持续时间
- 从一个月前开始的 1 周内的平均持续时间
- 上周平均持续时间
- 过去一天的平均持续时间
- 选定日期的平均持续时间
- % 减少 -> 这是在 SSRS 中计算的所有平均值之间的最差差异
简化的多维数据集 - 尝试遵循 MS 文章中的建议
- Activities.Duration 女士
- Activities.Activities 计数
- Functions.Fuction键
- Functions.Function描述
- Dates.Date 键(注意此时日期维度没有层次结构)
- Dates.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 吗?
随着时间层次结构的出现,"travel" 沿着日期变得更加困难。
但是这里有一个简单的例子,你想要作为例子的 2 个措施。
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] )