使用线性回归排除 MDX 预测的成员
Exclude a member for MDX forecasting using linear regression
我想使用完整 前几个月的数据预测下个月的度量值。
例如现在 9 月 11 日,我必须根据 1 月至 8 月的值预测 9 月的值(因为 9 月尚未结束)。
我正在使用 MDX 函数 LinRegPoint,其层次结构详述如下
- DimTime
- Hierarchy Time
- Year
- Quarter
- Month
这是我一直在尝试但没有成功的查询:
WITH
MEMBER [Measures].[Trend] AS
LinRegPoint
(
Rank
(
[Time].[Hierarchy Time].CurrentMember
,[Time].[Hierarchy Time].CurrentMember.Level.MEMBERS
)
,Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].CurrentMember.Level
)
,[Measures].[Quality]
,Rank
(
[Time].[Hierarchy Time]
,[Time].[Hierarchy Time].Level.MEMBERS
)
)
SELECT
{
[Measures].[Quality]
,[Measures].[Trend]
} ON COLUMNS
,Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month]
) ON ROWS
FROM [Cube];
上面的查询 return 到今天为止的所有月份预测值,包括 9 月,但是它预测 9 月的值采用当前日期 1 月到 9 月的实际值。我需要 LinRegPoint 函数只需要前一个完整的月份,在本例中为 1 月到 8 月。
请注意查询 return 是 9 个月(9 月)的预测值,但它使用实际值来计算它。如下图所示,这会导致被误解的行。
此图显示绘制的线采用了前一个完整月份 (1-8):
注意正斜率线。
此图显示了绘制的所有月份 (1-9)
注意负斜率线。
问题:
如何从实际值中排除不完整的当前月份,但允许计算预测值。
编辑:
该集应该更改为在实际值中排除最后一个月的成员,但计算它的预测值。
感谢您考虑我的问题。
解决方案:
WITH MEMBER [Measures].[Trend] AS
LinRegPoint
(
Rank(
[Time].[Hierarchy Time].CurrentMember
,[Time].[Hierarchy Time].CurrentMember.Level.MEMBERS
)
,Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].CurrentMember.Level
)
,[Measures].[QltyNoCurrentVal]
,Rank(
[Time].[Hierarchy Time]
,[Time].[Hierarchy Time].Level.MEMBERS)
),FORMAT_STRING='Standard' //Formating
MEMBER [Measures].[QltyNoCurrentVal] AS
IIF(
[Time].[Hierarchy Time].CurrentMember is [Time].[Hierarchy Time].[2015].[3].[9]
, NULL
, [Measures].[Quality]
),FORMAT_STRING='Standard' //Formating
select {
[Measures].[QltyNoCurrentVal]
,[Measures].[Trend]} ON COLUMNS
,Descendants(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month]
) ON ROWS
FROM [Cube]
有点困惑您的表达式中的哪些集需要更改。
我创建了一个集合 [MthsExclSept]
,您应该可以在脚本的其余部分的任何地方使用它 - 我只是在两个地方使用了它:
WITH
SET [MthsExclSept] AS
SubSet
(
Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month] //<<better to specify the month level
)
,0
,
Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month] //<<better to specify the month level
).Count
- 1
)
MEMBER [Measures].[Trend] AS
LinRegPoint
(
Rank
(
[Time].[Hierarchy Time].CurrentMember
,[MthsExclSept] //<<also added here?
)
,[MthsExclSept]
,[Measures].[Quality]
,Rank
(
[Time].[Hierarchy Time]
,[MthsExclSept] //<<also added here?
)
)
MEMBER [Measures].[QualityNEW] AS
IIF(
[Time].[Hierarchy Time].CurrentMember is [Time].[Hierarchy Time].[September]
, NULL
, [Measures].[Quality]
)
SELECT
{
[Measures].[QualityNEW]
,[Measures].[Trend]
} ON COLUMNS
,[MthsExclSept] ON ROWS
FROM [Cube];
集合 [MthsExclSept]
刚刚削减了上个月。这是来自 AdvWrks 的证明,它从一年中删除了 12 月:
WITH
SET [MthsExclSept] AS
SubSet
(
Descendants
(
[Date].[Calendar].[Calendar Year].&[2009]
,[Date].[Calendar].[Month]
)
,0
,
Descendants
(
[Date].[Calendar].[Calendar Year].&[2009]
,[Date].[Calendar].[Month]
).Count
- 1
)
SELECT
{} ON 0
,[MthsExclSept] ON 1
FROM [Adventure Works];
它returns以下内容:
我想使用完整 前几个月的数据预测下个月的度量值。
例如现在 9 月 11 日,我必须根据 1 月至 8 月的值预测 9 月的值(因为 9 月尚未结束)。
我正在使用 MDX 函数 LinRegPoint,其层次结构详述如下
- DimTime
- Hierarchy Time
- Year
- Quarter
- Month
这是我一直在尝试但没有成功的查询:
WITH
MEMBER [Measures].[Trend] AS
LinRegPoint
(
Rank
(
[Time].[Hierarchy Time].CurrentMember
,[Time].[Hierarchy Time].CurrentMember.Level.MEMBERS
)
,Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].CurrentMember.Level
)
,[Measures].[Quality]
,Rank
(
[Time].[Hierarchy Time]
,[Time].[Hierarchy Time].Level.MEMBERS
)
)
SELECT
{
[Measures].[Quality]
,[Measures].[Trend]
} ON COLUMNS
,Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month]
) ON ROWS
FROM [Cube];
上面的查询 return 到今天为止的所有月份预测值,包括 9 月,但是它预测 9 月的值采用当前日期 1 月到 9 月的实际值。我需要 LinRegPoint 函数只需要前一个完整的月份,在本例中为 1 月到 8 月。
请注意查询 return 是 9 个月(9 月)的预测值,但它使用实际值来计算它。如下图所示,这会导致被误解的行。
此图显示绘制的线采用了前一个完整月份 (1-8):
注意正斜率线。
此图显示了绘制的所有月份 (1-9)
注意负斜率线。
问题: 如何从实际值中排除不完整的当前月份,但允许计算预测值。
编辑: 该集应该更改为在实际值中排除最后一个月的成员,但计算它的预测值。
感谢您考虑我的问题。
解决方案:
WITH MEMBER [Measures].[Trend] AS
LinRegPoint
(
Rank(
[Time].[Hierarchy Time].CurrentMember
,[Time].[Hierarchy Time].CurrentMember.Level.MEMBERS
)
,Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].CurrentMember.Level
)
,[Measures].[QltyNoCurrentVal]
,Rank(
[Time].[Hierarchy Time]
,[Time].[Hierarchy Time].Level.MEMBERS)
),FORMAT_STRING='Standard' //Formating
MEMBER [Measures].[QltyNoCurrentVal] AS
IIF(
[Time].[Hierarchy Time].CurrentMember is [Time].[Hierarchy Time].[2015].[3].[9]
, NULL
, [Measures].[Quality]
),FORMAT_STRING='Standard' //Formating
select {
[Measures].[QltyNoCurrentVal]
,[Measures].[Trend]} ON COLUMNS
,Descendants(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month]
) ON ROWS
FROM [Cube]
有点困惑您的表达式中的哪些集需要更改。
我创建了一个集合 [MthsExclSept]
,您应该可以在脚本的其余部分的任何地方使用它 - 我只是在两个地方使用了它:
WITH
SET [MthsExclSept] AS
SubSet
(
Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month] //<<better to specify the month level
)
,0
,
Descendants
(
[Time].[Hierarchy Time].[2015]
,[Time].[Hierarchy Time].[Month] //<<better to specify the month level
).Count
- 1
)
MEMBER [Measures].[Trend] AS
LinRegPoint
(
Rank
(
[Time].[Hierarchy Time].CurrentMember
,[MthsExclSept] //<<also added here?
)
,[MthsExclSept]
,[Measures].[Quality]
,Rank
(
[Time].[Hierarchy Time]
,[MthsExclSept] //<<also added here?
)
)
MEMBER [Measures].[QualityNEW] AS
IIF(
[Time].[Hierarchy Time].CurrentMember is [Time].[Hierarchy Time].[September]
, NULL
, [Measures].[Quality]
)
SELECT
{
[Measures].[QualityNEW]
,[Measures].[Trend]
} ON COLUMNS
,[MthsExclSept] ON ROWS
FROM [Cube];
集合 [MthsExclSept]
刚刚削减了上个月。这是来自 AdvWrks 的证明,它从一年中删除了 12 月:
WITH
SET [MthsExclSept] AS
SubSet
(
Descendants
(
[Date].[Calendar].[Calendar Year].&[2009]
,[Date].[Calendar].[Month]
)
,0
,
Descendants
(
[Date].[Calendar].[Calendar Year].&[2009]
,[Date].[Calendar].[Month]
).Count
- 1
)
SELECT
{} ON 0
,[MthsExclSept] ON 1
FROM [Adventure Works];
它returns以下内容: