2016-10-10 36 views
0

目標:創建報告,將在基於特定歷史數據使用SQL度過每一天,以顯示會議系統的使用量

的一天中的任何時間提供我們的會議系統上線的平均數量:會議唯一ID,會議開始時間(時間),會議結束時間(時間),會議持續時間(基本上是結束時間開始時間的整數),每個會議的線數。這些是大約250,000行代表2年數據的SQL表中的列。

問題:起初看起來很簡單。只需運行,通過小時和分鐘發現行之和組類似下面的查詢:

Select Datepart(hour,[Actual Conference Begin Time]) as 'Hour', 
     Datepart(minute,[Actual Conference Begin Time]) as 'Minute', 
     SUM([Actual Total Lines]) as 'Lines' 
From Filtered 
Group By DatePart(hour,[Actual Conference Begin Time]), 
     Datepart(minute,[Actual Conference Begin Time]) 
Order By DatePart(hour,[Actual Conference Begin Time]), 
     Datepart(minute,[Actual Conference Begin Time]) 

無論其此查詢只佔在電話線說,「開始在那個時候」的總和。它沒有捕捉到這樣的事實,即在一天中的任何給定時刻有多個呼叫正在進行,所有呼叫都在不同的時間開始並且在不同的持續時間運行。

建議的解決方案:我最初的計劃是要創建另一個表並使用一個循環來填充一個小時內每小時一分鐘的循環。然後本質上「解析」我的數據主表,並逐行查找開始時間,持續時間和行數,然後轉到我的小時/分鐘表並填充它,從開始時間開始並向下排列相同數字作爲持續時間的行數。它會通過添加到當前單元格中的值(而不是替換)在另一列中填充「行數」中的每一行。小時/分鐘表實際上是系統中任何給定小時/分鐘的線路的一個大計數板。

建議解決方案2:我也想到了另一種可能的解決方案。查看數據庫中的每一行,並在開始和結束時間戳之間創建更多的每分鐘相同的行。舉例來說,如果您有10分鐘的電話通話時間,則會在每列中創建另外9行,並且所有相同的信息都會被創建,除了時間戳會在每行中增加一分鐘。現在,表中將有足夠的數據運行上面的聚合查詢。

我已經創建了小時/分鐘的shell表,但是到達了一個點,我認爲上述解決方案在SQL中可能不可行。我也試圖在沒有結果的情況下操縱Tableau中的數據。

請讓我知道,如果你知道一個解決方案來呈現這些信息,無論是SQL還是其他方法。我有更多的代碼可以分享以展示進步。

謝謝。

+1

使用一個計數表n = int從0到期間的分鐘數。將n分鐘添加到期間的開始日期。那是你的日曆。現在,您可以在日曆中的每一分鐘內加入外部加入事件。分組後按分鐘添加行。 – Mike

回答

0

我不能忍受你的列名,因爲需要轉義,所以我簡化了它們。

這是想法。爲每個開始和結束創建一個新記錄。然後在每個時間點,加起來開始與結束的數量,你會得到在任何時間點的數量:

with be as (
     select thetime, sum(inc) as in 
     from (select begintime as thetime, 1 as inc 
      from filtered 
      union all 
      select endtime, -1 as inc 
      from filtered 
      ) be 
    ) 
select thetime, sum(inc) over (order by thetime) as numConcurrentLines 
from be; 

這說明每一個電話會議開始和結束時間的值。這應該指向你想要做的事情的正確方向。

+0

謝謝戈登,我看了一下,發現了另一個解決方案,並最終做了這樣的事情(超級簡單,但我自己並不明顯): – Nick

0
DECLARE @t1 time(0)= '00:00:00' 
DECLARE @t2 time(0)= '00:01:00' 
DECLARE @counter int=1 

While @counter<=1440 
Begin 
SELECT @t1 as 'Time (24hr)', SUM([Actual Total Lines]) as 'Total Lines' 
FROM Filtered 
WHERE @t2 >= [Actual Conference Begin Time] AND [Actual Conference End Time]>= @t1 
Set @t1= Dateadd(minute,1,@t1) 
Set @t2= Dateadd(minute,1,@t2) 
Set @counter= @counter+1 
End; 
+0

謝謝戈登,我看了一下,找到了另一個解決方案,最終做了這樣的事情 - 超級簡單,但我自己並不明顯 – Nick