按日期范围分组的计数值

时间:2014-05-08 16:00:17

标签: mysql group-by

从呼叫详细记录(CDR)表中,我需要计算在指定时间范围内同时忙碌的最大频道。该表有一列用于呼叫时间的结束,另一列用于呼叫持续时间。

CallID  DateTime              Duration
  1     2014-04-28 11:37:54         35
  2     2014-04-28 11:37:53         82
  3     2014-04-28 11:37:42         53
  4     2014-04-28 11:37:37        159
  5     2014-04-28 11:37:13         49
  6     2014-04-28 11:37:02        267
  7     2014-04-28 11:37:00        267
  8     2014-04-28 11:36:54         49
  9     2014-04-28 11:36:20        266

我需要一份报告来获取这样的回复(例如时间范围,以小时为单位):

DateRange                NumBusyChannels
2014-04-28 11:00-12:00                 9
2014-04-28 10:00-11:00                 5

编辑:用于测试Miky响应的样本表。

CallID  DateTime             Duration
   014  2013-07-23 08:42:42        3
   015  2013-07-23 08:42:42        3
   019  2013-07-23 08:42:42        3
   012  2013-07-23 08:10:00        3
   013  2013-07-23 08:10:00        3
   016  2013-07-23 08:10:00        3
   017  2013-07-23 08:10:00        3
   018  2013-07-23 08:10:00        3

1 个答案:

答案 0 :(得分:0)

您可以从这样的查询开始,它可以为您提供每次通话的重叠通话次数。

SELECT COuter.*,
       COALESCE(COverlap.Cnt,0) as NumChannelsInUse
  FROM Cdr COuter
  LEFT OUTER JOIN(
    SELECT C1.CallId,
     COUNT(*) as Cnt
    FROM Cdr C1
    INNER JOIN Cdr C2
       ON (C2.DateTime >= C1.DateTime 
              AND 
           C2.DateTime <= DATE_ADD(C1.DateTime, INTERVAL C1.Duration SECOND))
           OR
          (DATE_ADD(C2.DateTime, INTERVAL C2.Duration SECOND) >= C1.DateTime 
              AND 
           DATE_ADD(C2.DateTime, INTERVAL C2.Duration SECOND)  <= DATE_ADD(C1.DateTime, INTERVAL C1.Duration SECOND))
           OR
          (C1.DateTime >= C2.DateTime 
              AND 
           C1.DateTime <= DATE_ADD(C2.DateTime, INTERVAL C2.Duration SECOND) )
           OR
          (DATE_ADD(C1.DateTime, INTERVAL C1.Duration SECOND) >= C2.DateTime 
              AND 
           DATE_ADD(C1.DateTime, INTERVAL C1.Duration SECOND) < DATE_ADD(C2.DateTime, INTERVAL C2.Duration SECOND))
    GROUP BY C1.CallId) COverlap
  ON COuter.CallId = COverlap.CallId

然后,您必须进一步操作查询以按小时对结果进行分区,然后选择每小时的最大值。