2013-07-09 49 views
1

我有一個包含調用數據的MS SQL 2012(40m記錄)的大表。我想找到通話的最高音量以及發生的時間。如果可能的話,我還想找到接下來的4個最繁忙的時期。找到最繁忙的時期

我計劃用3列: 呼叫標識 DialTime 結束時間

我能想到的唯一辦法做到這一點是要做到這一點:

Select '2013-07-01 00:00:01' as [Period], count([CallID]) as [Calls] 
from [Table] 
where DialTime <= '2013-07-01 00:00:01' 
and EndTime >= '2013-07-01 00:00:01' 

union 

Select '2013-07-01 00:00:02' as [Period], count([CallID]) as [Calls] 
from [Table] 
where DialTime <= '2013-07-01 00:00:02' 
and EndTime >= '2013-07-01 00:00:02' 

union 

etc 

任何人都可以提出一個更好/更這樣做的有效方法?

+0

相關但不完全重複的,你是2012年,有一個稍微不同的要求。 [Simultaneous calls](http://stackoverflow.com/q/17441864/73226) –

回答

0

嘗試類似這樣的東西。 @time_begin@time_end是您可以用於您想要獲得結果的時間間隔的參數。

with time_items (time_item) as 
(
    select @time_begin as time_item 
    union all 
    select dateadd(second,1,t.time_item) as time_item from time_items t where t.time_item<@time_end 
) 
select 
    time_items.time_item as [Period], 
    sum(case when [Table].DialTime<=time_items.time_item and [Table].EndTime>=time_items.time_item then 1 else 0 end) as [Calls] 
from time_items 
left outer join [Table] on 1=1 
group by 
    time_items.time_item 
order by 
    [Calls] desc; 
0

您可以使用值表源

SELECT DialTime, EndTime, o.Calls 
FROM (VALUES ('20130701 00:00:01', '20130701 00:00:01'), 
      ('20130701 00:00:02', '20130701 00:00:02'))x(DialTime, EndTime) 
    CROSS APPLY(
       SELECT COUNT(CallID) AS Calls  
       FROM [Table] t 
       WHERE DialTime <= x.DialTime 
       AND EndTime >= x.EndTime 
      ) o