1

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

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

我正在考虑使用日期范围的 StartDate 和 EndDate 维度(因此从我的 StartDate 维度的第一个日期到 2009 年 12 月 31 日和从 2009 年 12 月 31 日到我的 EndDate 维度的最后一个日期)。我会交叉加入那些。

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

有什么想法吗?

4

3 回答 3

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)

很简单。我认为我的问题不清楚,这就是为什么我得到不同的答案;-)

于 2010-09-29T11:53:51.980 回答
0

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

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

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

于 2010-09-28T18:49:38.473 回答
-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
于 2010-09-20T14:35:45.143 回答