3

我写了一个程序,它需要 3 个参数 StartDate、EndDate 和 TimeRange。根据 TimeRange,我的程序拆分日期并分别计算它们。这是我的程序:

PROCEDURE [dbo].[Procedure1] 

    @Start datetime, 
    @Finish datetime,
    @TimeRange time
AS
BEGIN

    SET NOCOUNT ON;

    declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime);

     with TimeRanges as (
  select @Start as StartTime, @Start + @TimeRange as EndTime
  union all
  select StartTime + @TimeRange, EndTime + @TimeRange
    from TimeRanges
    where EndTime  < @Finish )
  select StartTime, EndTime, Count( Test.ScenarioID ) as TotalInboundArrivals
    from TimeRanges as TR left outer join
      dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime
    where Test.ScenarioID = 24  
    group by TR.StartTime, TR.EndTime   
END

例如,

Start Time: 11:00
End Time: 12:00
TimeRange : 05:00

This procudure splits them like
     TimeRange    TotalCallPeaks
    11:00 11:05      12
    11:05 11:10      8
    11:10 11:15      15 
    etc..

这是我的问题:我需要同时发生的最大呼叫。换句话说,我需要通话高峰。任何建议或线索对我来说都会非常有用。

在此处输入图像描述 在这个时间范围内发生了 6 次调用,但其中 4 次是同时发生的,我想计算一下。最大点显示最大呼叫峰值。在此时间范围内发生了第 5 次和第 6 次调用,但对最大调用峰值没有影响。

4

2 回答 2

0

我为执行类似查询所做的是使用数字辅助表(例如,数字为 1 到 100 万的表)。

像拼图一样查看查询。首先,假设您有开始和结束时间。

中午 12:00 - 下午 2:00

交叉加入数字表,现在你有

1; 12:00pm; 2:00pm
2; 12:00pm; 2:00pm
3; 12:00pm; 2:00pm
4; 12:00pm; 2:00pm
etc...

接下来,将辅助数字乘以您想要的间隔,例如 10

10; 12:00pm; 2:00pm
20; 12:00pm; 2:00pm
30; 12:00pm; 2:00pm
40; 12:00pm; 2:00pm
etc...

接下来,将计算出的数字添加到开始时间(如果这是您的间隔单位,则以分钟为单位)使用 DATEADD 函数

10; 12:00pm; 2:00pm; 12:10
20; 12:00pm; 2:00pm; 12:20
30; 12:00pm; 2:00pm; 12:30
40; 12:00pm; 2:00pm; 12:40
etc...

现在只获取开始时间和结束时间之间的计算时间间隔,无论是使用where子句还是您选择的范围内连接,交叉应用等......

然后,说“t1”现在是您从上述结果集中派生的表。对于每一行,选择在该时间点处于活动状态的呼叫数,如下所示:

select * FROM t1 cross apply (select sum(1) numcalls from yourtable t2 where t1.calculatedtimeinterval between t2.startdatetime 和 t2.enddatetime ) t3

赢!

于 2012-11-14T18:03:07.163 回答
0

这应该是一个 O(n log n) 算法:

  1. 将所有记录转储到#temp 表中
  2. 将时间范围一分为二,运行查询查看哪个时间范围的调用次数较多
    • 修剪落在另一半的记录
    • 如果两半的调用次数相同,则保留并处理两半。这可能会导致您的工作集从 2 增加到 4 等,但对于任何不能产生与其他人相同的计数的“一半”可能会再次下降
    • 如果两半都包含相同的记录:可以将此分支标记为已完成。该呼叫在整个时间范围内是同时进行的。您可以在此处停止(标记为已确定)以获取“一个答案”,也可以继续查找“所有答案”。

可以处理此问题的 SP 的草案结构:

表:#WorkingSets

  • 分区(int):最初是左/右,然后是 LLL/LLR/RLR 等
  • session_id :这可以同时出现在多个分区中
  • session_start
  • session_end
  • curr_range_start
  • curr_range_end :将开始/结束之间的范围减半
  • 最终确定(位)

变量

  • @max_calls_per_partition :一旦找到任何“最终”集,就被锁定
于 2012-10-23T09:25:30.767 回答