2011-10-11 42 views
1

嗨,我想計算特定時間片的批量運行實例的數量。例如,我有一個表:計算在特定時間範圍內運行的實例的數量

BatchID startTime endTime 
12957 10:15 10:25 
13032 10:16 10:20 
13080 10:16 10:22 
13090 10:16 10:20 
13214 10:19 10:30 
13232 10:19 10:22 
13276 10:19 10:29 
13279 10:19 10:30 
13315 10:20 10:23 
13341 10:20 10:24 
13430 10:22 10:33 
13566 10:27 10:30 
13580 10:27 10:31 
13585 10:28 10:31 
13596 10:28 10:32 
13626 10:30 10:42 
13637 10:32 10:35 
13699 10:40 10:44 
13702 10:41 10:45 

實例在運行10:41的數目將是3,運行批次:BatchID 13626,13699和13702

形象化這個問題,我從10點15分到10點41分以10分鐘的時間段作爲x軸進行聊天,並將在該時間點運行的實例的數量作爲y軸。我想在ORACLE(SQL/PLSQL)或EXCEL(函數/ VBA /數據透視表等)中實現,你有什麼建議?

+0

「startTime」和「endTime」的數據類型是什麼? –

+0

startTime和endTime是日期/時間格式。 – Dean

回答

1

創建你的樣表:

SQL> create table mytable (batchid,starttime,endtime) 
    2 as 
    3 select 12957, '10:15', '10:25' from dual union all 
    4 select 13032, '10:16', '10:20' from dual union all 
    5 select 13080, '10:16', '10:22' from dual union all 
    6 select 13090, '10:16', '10:20' from dual union all 
    7 select 13214, '10:19', '10:30' from dual union all 
    8 select 13232, '10:19', '10:22' from dual union all 
    9 select 13276, '10:19', '10:29' from dual union all 
10 select 13279, '10:19', '10:30' from dual union all 
11 select 13315, '10:20', '10:23' from dual union all 
12 select 13341, '10:20', '10:24' from dual union all 
13 select 13430, '10:22', '10:33' from dual union all 
14 select 13566, '10:27', '10:30' from dual union all 
15 select 13580, '10:27', '10:31' from dual union all 
16 select 13585, '10:28', '10:31' from dual union all 
17 select 13596, '10:28', '10:32' from dual union all 
18 select 13626, '10:30', '10:42' from dual union all 
19 select 13637, '10:32', '10:35' from dual union all 
20 select 13699, '10:40', '10:44' from dual union all 
21 select 13702, '10:41', '10:45' from dual 
22/

Table created. 

介紹開始和你要報告的時間間隔結束作爲綁定變量。您可以通過其引導冒號來識別SQL和PL/SQL中綁定變量的使用。

SQL> var START_X_AXIS varchar2(5) 
SQL> var END_X_AXIS varchar2(5) 
SQL> begin 
    2 :START_X_AXIS := '10:15'; 
    3 :END_X_AXIS := '10:41'; 
    4 end; 
    5/

PL/SQL procedure successfully completed. 

並且爲了清楚起見,在三個階段執行查詢。首先將varchar2時間轉換爲實際日期(順便提一句,建議也是像這樣存儲它們)。第二個查詢顯示您的報告在X軸上的所有分鐘數。第三個是計數。

SQL> with mytable_with_real_dates as 
    2 (select batchid 
    3   , to_date(starttime,'hh24:mi') starttime 
    4   , to_date(endtime,'hh24:mi') endtime 
    5  from mytable 
    6 ) 
    7 , all_minutes as 
    8 (select to_date(:START_X_AXIS,'hh24:mi') + numtodsinterval(level-1,'minute') minute 
    9  from dual 
10 connect by level <= 24 * 60 * (to_date(:END_X_AXIS,'hh24:mi') - to_date(:START_X_AXIS,'hh24:mi')) + 1 
11 ) 
12 select to_char(m.minute,'hh24:mi') 
13  , count(t.batchid) 
14 from all_minutes m 
15   left outer join mytable_with_real_dates t on (m.minute between t.starttime and t.endtime) 
16 group by m.minute 
17 order by m.minute 
18/

TO_CH COUNT(T.BATCHID) 
----- ---------------- 
10:15    1 
10:16    4 
10:17    4 
10:18    4 
10:19    8 
10:20    10 
10:21    8 
10:22    9 
10:23    7 
10:24    6 
10:25    5 
10:26    4 
10:27    6 
10:28    8 
10:29    8 
10:30    8 
10:31    5 
10:32    4 
10:33    3 
10:34    2 
10:35    2 
10:36    1 
10:37    1 
10:38    1 
10:39    1 
10:40    2 
10:41    3 

27 rows selected. 

編輯:我剛剛看到您的評論,您的列存儲爲日期。這是個好消息,所以你可以跳過第一部分,從第7行開始,用單詞「WITH」替換逗號。

Regards,
Rob。

+0

Rob,我怎樣才能將時間間隔從1分鐘增加到10分鐘? – Dean

+0

通過更改all_minutes子查詢。用24 * 6替換24 * 60,用(1級)* 10替換1級。 –

2

要列出所有在特定的時間:

SELECT BatchID, startTime, endTime 
FROM Batch 
WHERE :instanceTime BETWEEN startTime AND endTime 

或者只是指望他們:

SELECT COUNT(*) AS numConcurrent 
FROM Batch 
WHERE :instanceTime BETWEEN startTime AND endTime 

但是如果你需要查詢其在某個區間時,它都會更快查詢在你的時間間隔內的所有批次,並用一些編程邏輯對它們進行計數。

SELECT startTime, endTime 
FROM Batch 
WHERE endTime > :intervalStart 
AND startTime < :intervalEnd 
ORDER BY startTime 

:instanceTime是查詢參數。這些參數將替換爲您在查詢旁邊提供的值,並且您不必擔心格式和轉義。 (某些數據提供商使用?作爲參數。)

如果您不能使用參數,則可以用實際值替換它們。在這種情況下,請不要忘記使用to_date()


下面是日期參數在VBA一些用法示例:
Bytes.com: How to pass date parameter into Oracle SQL string in VBA

+1

爲了讓事情變得簡單,怎麼樣? – Ben

+0

我不熟悉冒號,什麼是:instanceTime? – Dean

相關問題