SSAS - 在一段时间内发生的事实

时间:2010-09-20 14:16:42

标签: database time ssas cube dimensions

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

很明显,我的事实有一个start_date和一个end_date。所以,假设我的start_date是01/01/2008,而我的end_date是01/01/2011。我需要了解2009年发生的事实和今年发生的事实。这两年也可能发生同样的事实。确定事实的方法是2009年的一部分是检查12/31/2009。

我正在考虑使用日期范围的StartDate和EndDate维度(从我的StartDate维度的第一个日期到12/31/2009以及从12/31/2009到我的EndDate维度中的最后一个日期)。我会加入那些。

我试了一下,它有效,但它真的很慢。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我找到了我想要的解决方案。大卫和克里斯为你们举行了比赛!这是我想要实现的,但我缺乏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)

非常简单。我认为我的问题不明确,这就是我得到不同答案的原因; - )

答案 1 :(得分:0)

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

选择[开始日期]。[年]。[2009]:[结束日期]。[年]。[2010]在0 来自立方体

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

答案 2 :(得分:-1)

您只需要一个日期维度DimDate。您的事实表可以有2个外键到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