2017-07-28 74 views
0

林拼图至于如何建立我的事实和尺寸procude以下结果:MDX查询随着时间间隔计数登录OCCURENCES

我想指望人们记录每个时间间隔的出现次数的数量。

在这种情况下每隔30分钟。它看起来像这样

Example: Person1 login at 10:05:00 and logout at 12:10:00 
     Person2 login at 10:45:00 and logout at 11:25:00 
     Person3 login at 11:05:00 and logout at 14:01:00 

    TimeStart TimeEnd  People logged 

    00:00:00 00:30:00 0 
    00:30:00 01:00:00 0 
    ... 
    10:00:00 10:30:00 1 
    10:30:00 11:00:00 2 
    11:00:00 11:30:00 3 
    11:30:00 12:00:00 2 
    12:00:00 12:30:00 2 
    12:30:00 13:00:00 1 
    13:00:00 13:30:00 1 
    13:30:00 14:00:00 1 
    14:00:00 14:30:00 0 
    ... 
    23:30:00 00:00:00 0 

所以我必须包含小时,halfhour一个DimTime和DimDate表,quarterhour 和我有具有以下一个FactTimestamp表:

DateLoginID that points to DimDate dateID 
DateLogoutID that points to DimDate dateID 
TimeLoginID that points to DimTime timeID 
TimeLogoutID that points to DimTime timeID 

我想知道我需要达到什么样的立方体设计?

香港专业教育学院做了在SQL中,如果能够帮助:

--Create tmp table for time interval 
    CREATE TABLE #tmp(
     StartRange time(0), 
     EndRange time(0), 
    ); 
    --Interval set to 30 minutes 
    DECLARE @Interval int = 30 
    -- Example with @Date = 2017-07-27: Set starttime at 2017-07-27 00:00:00 
    DECLARE @StartTime datetime = DATEADD(HOUR,0, @Date) 
    --Set endtime at 2017-07-27 23:59:59 
    DECLARE @EndTime datetime = DATEADD(SECOND,59,DATEADD(MINUTE,59,DATEADD(HOUR,23, @Date))) 
    --Populate tmp table with the time interval. from midnight to 23:59:59 
    ;WITH cSequence AS 
    (
     SELECT 
      @StartTime AS StartRange, 
      DATEADD(MINUTE, @Interval, @StartTime) AS EndRange 
     UNION ALL 
     SELECT 
      EndRange, 
      DATEADD(MINUTE, @Interval, EndRange) 

     FROM cSequence 
     WHERE DATEADD(MINUTE, @Interval, EndRange) <= @EndTime 
    ) 
    INSERT INTO #tmp SELECT cast(StartRange as time(0)),cast(EndRange as time(0)) FROM cSequence OPTION (MAXRECURSION 0); 
    --Insert last record 23:30:00 to 23:59:59 
    INSERT INTO #tmp (StartRange, EndRange) values ('23:30:00','23:59:59'); 

    SELECT tmp.StartRange as [Interval], COUNT(ts.TimeIn) as [Operators] 
    FROM #tmp tmp 

    JOIN Timestamp ts ON  
           --If timeIn is earlier than StartRange OR within the start/end range       
           (CAST(ts.TimeIn as time(0)) <= tmp.StartRange OR CAST(ts.TimeIn as time(0)) BETWEEN tmp.StartRange AND tmp.EndRange) 
           AND 
           --AND If timeOut is later than EndRange OR within the start/end range      
           CAST(ts.[TimeOut] as time(0)) >= tmp.EndRange OR CAST(ts.[TimeOut] as time(0)) BETWEEN tmp.StartRange AND tmp.EndRange      

    GROUP BY tmp.StartRange, tmp.EndRange 
END 

真的任何暗示对如何实现它在MDX将不胜感激。

回答

0

老实说,我不会在MDX中对该表结构进行操作。即使您成功获得返回该值的MDX查询,并且确实可以完成该操作,它很可能会非常复杂且难以维护和调试,并且可能需要事实表上多次传递以获取数字,伤害表现。

我认为这是定期快照表格的明确例子。选择你的粒度,但即使在1分钟快照下,每天所有其他维度的每个元组也能获得1440个数据点。如果您的登录/注销表很大,您可能需要减少此值以保持其大小可控。最后,你会得到一个表格,其中包含time_id,count_of_logins,以及其他任何你需要的关键字,而你需要的查询只是一个你想要的时间段的过滤器(给我一天中的所有时间,但是过滤每小时只有分钟00和30)并且登录用户总数的计数是微不足道的。

+0

很有意思。我不知道这个定期的快照表解决方案。我会仔细看看这个。谢谢! –

+0

通过Kimball阅读,他详细解释了何时何时不使用它以及如何使用它。 – nsousa

+0

如果我必须在MDX中完成这项工作,我需要在我的设计上进行更改才能使其成为可能? @nsousa –