Database SSAS-在一定时间范围内发生的事实

Database SSAS-在一定时间范围内发生的事实,database,time,ssas,cube,dimensions,Database,Time,Ssas,Cube,Dimensions,我真的不知道如何处理在一段时间内发生的事实。我通常处理发生在特定日期的事实 很明显,我的事实有开始日期和结束日期。那么,假设我的开始日期是2008年1月1日,结束日期是2011年1月1日。我需要得到2009年和今年发生的这些事实的数量。同样的事实也可能发生在这两年。确定一个事实是2009年的一部分的方法是检查2009年12月31日 我在考虑开始日期和结束日期维度,使用日期范围(从开始日期维度的第一个日期到2009年12月31日,从2009年12月31日到结束日期维度的最后一个日期)。我会交叉加入

我真的不知道如何处理在一段时间内发生的事实。我通常处理发生在特定日期的事实

很明显,我的事实有开始日期和结束日期。那么,假设我的开始日期是2008年1月1日,结束日期是2011年1月1日。我需要得到2009年和今年发生的这些事实的数量。同样的事实也可能发生在这两年。确定一个事实是2009年的一部分的方法是检查2009年12月31日

我在考虑开始日期和结束日期维度,使用日期范围(从开始日期维度的第一个日期到2009年12月31日,从2009年12月31日到结束日期维度的最后一个日期)。我会交叉加入那些

我试过了,效果不错,但速度很慢


有什么想法吗?

您只需要一个日期维度DimDate。事实表可以有两个DimDate外键,一个用于startdate,一个用于enddate

FactTable
{
    FactID int,
    StartDate int,
    EndDate int
    -- Other fields
}

DimDate
{
    DimDateID int,
    Year int,
    Month int,
    Day int,
    -- Other fields if needed
}
要获取2009年的所有事实,请使用

SELECT f.FactID FROM FactTable f
INNER JOIN DimDate dStart ON dStart.DimDateID = f.StartDate
INNER JOIN DimDate dEnd ON dEnd.DimDateID = f.EndDate
WHERE dStart.Year <= 2009
  AND dEnd.Year >= 2009
从FactTable f中选择f.FactID
dStart.DimDateID=f.StartDate上的内部联接DimDate dStart
dEnd上的内部联接DimDate dEnd.DimDateID=f.EndDate
其中dStart.Year=2009

您只需要一个日期维度DimDate。事实表可以有两个DimDate外键,一个用于startdate,一个用于enddate

FactTable
{
    FactID int,
    StartDate int,
    EndDate int
    -- Other fields
}

DimDate
{
    DimDateID int,
    Year int,
    Month int,
    Day int,
    -- Other fields if needed
}
要获取2009年的所有事实,请使用

SELECT f.FactID FROM FactTable f
INNER JOIN DimDate dStart ON dStart.DimDateID = f.StartDate
INNER JOIN DimDate dEnd ON dEnd.DimDateID = f.EndDate
WHERE dStart.Year <= 2009
  AND dEnd.Year >= 2009
从FactTable f中选择f.FactID
dStart.DimDateID=f.StartDate上的内部联接DimDate dStart
dEnd上的内部联接DimDate dEnd.DimDateID=f.EndDate
其中dStart.Year=2009

您始终可以使用具有两个时间维度的日期范围,如:

在0上选择[开始日期].[year].[2009]:[结束日期].[year].[2010] 从立方体


如果我理解正确的话。两个时间维度应该很好地协同工作。我在一个工作项目中有两个人,他们一起工作的速度相当快。确保在多维数据集的“维度使用”部分设置了它们,以便区分这两个日期

您始终可以使用具有两个时间维度的日期范围,如:

在0上选择[开始日期].[year].[2009]:[结束日期].[year].[2010] 从立方体


如果我理解正确的话。两个时间维度应该很好地协同工作。我在一个工作项目中有两个人,他们一起工作的速度相当快。确保在多维数据集的“维度使用”部分设置了它们,以便区分这两个日期

我找到了我想要的解决方案。大卫和克里斯参加了anwsers tho!以下是我想要实现的目标,但我缺少MDX语法:

SELECT  [Measures].[NumberX] ON COLUMNS
FROM    [MyCube]
WHERE   ([START DATE].[REFDATE].FirstMember:[START DATE].[REFDATE].&[2009-12-31T00:00:00],
        [END DATE].[REFDATE].&[2010-01-01T00:00:00]:[END DATE].[REFDATE].LastMember)

很简单。我想我的问题不清楚,所以我得到了不同的答案;-)

我找到了我想要的解决方案。大卫和克里斯参加了anwsers tho!以下是我想要实现的目标,但我缺少MDX语法:

SELECT  [Measures].[NumberX] ON COLUMNS
FROM    [MyCube]
WHERE   ([START DATE].[REFDATE].FirstMember:[START DATE].[REFDATE].&[2009-12-31T00:00:00],
        [END DATE].[REFDATE].&[2010-01-01T00:00:00]:[END DATE].[REFDATE].LastMember)

很简单。我想我的问题不清楚,所以我得到了不同的答案;-)

好吧,那基本上是我的解决办法。但这样做需要我为今年、去年、上月等创建查询,从而为每个查询生成一个度量值组。我一直在寻找一种方法来创建一个查询(也就是一个度量值组),这样我就可以在calc脚本中使用时间维度进行分析。我明白了。那么,您想要一个生成报告的查询,该报告显示每年的事实数量?我希望能够同时显示当前的事实数量、上月的事实数量以及去年当月的事实数量。我通常会在我的calc脚本中使用MDX表达式处理在特定日期发生的事实,比如([Measures].[Total number of X],[date].[Year].[2009])。我现在的问题是,事实的日期不是2009年,而是2009年包含在开始日期和结束日期之间¸在我的事实定义中。我认为你有>和<错误的方法。e、 g.如果某件事情在2009年开始,在2010年结束,那么使用提供的查询将错过它,因此我想我将继续使用SQL查询而不是MDX表达式来完成它。好的,这基本上是我的解决方法。但这样做需要我为今年、去年、上月等创建查询,从而为每个查询生成一个度量值组。我一直在寻找一种方法来创建一个查询(也就是一个度量值组),这样我就可以在calc脚本中使用时间维度进行分析。我明白了。那么,您想要一个生成报告的查询,该报告显示每年的事实数量?我希望能够同时显示当前的事实数量、上月的事实数量以及去年当月的事实数量。我通常会在我的calc脚本中使用MDX表达式处理在特定日期发生的事实,比如([Measures].[Total number of X],[date].[Year].[2009])。我现在的问题是,事实的日期不是2009年,而是2009年包含在开始日期和结束日期之间¸在我的事实定义中。我认为你有>和<错误的方法。e、 g.如果某件事情在2009年开始,在2010年结束,那么使用提供的查询将错过它,因此我想我将继续使用SQL查询而不是MDX表达式来完成它。首先,基本上是相反的。我希望在我的开始日期和结束日期之间包含一个特定日期,或者说我希望包含其他日期(myDate>startDate和myDatestartDate和myDate