2013-01-21 25 views
2

我們有連接到一個子系統的進程,我們通過這個時間戳跟蹤 。我想知道的是在N分鐘的時間間隔內最多連接的進程數量爲 。獲取在一個時間間隔內連接的最大進程數

此時間間隔是進程的TIMEOUT時間間隔,因此經過時間的倒計時開始於連接時間。所以間隔 是一個「浮動」間隔。

爲簡單起見,此間隔的長度爲5分鐘,連接時間以分鐘爲單位,而不是以毫秒爲單位。

我們已經有一個PL/SQL函數來計算這個數字,但是我想知道是否有可能只用一個SQL來完成它。

例子:

09:10   09:15   09:20   09:25   09:30 
    |    |    |    |    | 
----|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--- 
    |    |    |    |    | 
      | | |   | |  | | | |  |  | 
      a b c   a c  a b c d  a  f  <-- PROCESSES 
               f  b    <-- PROCESSES 

下面是PROCESSES表的SQL:

create table PRCS 
(
    prc_id NUMBER(12) not null, 
    prc_name VARCHAR2(25) not null 
); 

alter table PRCS add constraint PRCS_PK primary key (PRC_ID); 
alter table PRCS add constraint PRCS_UK unique (PRC_NAME); 

insert into PRCS values('1', 'a'); 
insert into PRCS values('2', 'b'); 
insert into PRCS values('3', 'c'); 
insert into PRCS values('4', 'd'); 
insert into PRCS values('5', 'e'); 
insert into PRCS values('6', 'f'); 

下面是連接表的SQL:

create table CON_JOURNAL 
(
    con_id NUMBER(12) not null, 
    con_date TIMESTAMP(6) not null, 
    con_prc NUMBER(12) not null 
) 
; 
alter table CON_JOURNAL add constraint CON_PK primary key (CON_ID); 
alter table CON_JOURNAL add constraint CON_UK unique (CON_DATE, CON_PRC); 
alter table CON_JOURNAL add constraint CON_PRC_FK foreign key (CON_PRC) 
     references PRCS (PRC_ID); 

insert into CON_JOURNAL values('1', to_date('2013.01.09 09:12', 'yyyy.mm.dd hh24:mi'), '1'); 
insert into CON_JOURNAL values('2', to_date('2013.01.09 09:13', 'yyyy.mm.dd hh24:mi'), '2'); 
insert into CON_JOURNAL values('3', to_date('2013.01.09 09:14', 'yyyy.mm.dd hh24:mi'), '3'); 

insert into CON_JOURNAL values('4', to_date('2013.01.09 09:18', 'yyyy.mm.dd hh24:mi'), '1'); 
insert into CON_JOURNAL values('5', to_date('2013.01.09 09:19', 'yyyy.mm.dd hh24:mi'), '3'); 

insert into CON_JOURNAL values('6', to_date('2013.01.09 09:21', 'yyyy.mm.dd hh24:mi'), '1'); 
insert into CON_JOURNAL values('7', to_date('2013.01.09 09:22', 'yyyy.mm.dd hh24:mi'), '2'); 
insert into CON_JOURNAL values('8', to_date('2013.01.09 09:23', 'yyyy.mm.dd hh24:mi'), '3'); 
insert into CON_JOURNAL values('9', to_date('2013.01.09 09:24', 'yyyy.mm.dd hh24:mi'), '4'); 
insert into CON_JOURNAL values('10', to_date('2013.01.09 09:24', 'yyyy.mm.dd hh24:mi'), '6'); 

insert into CON_JOURNAL values('11', to_date('2013.01.09 09:26', 'yyyy.mm.dd hh24:mi'), '1'); 
insert into CON_JOURNAL values('12', to_date('2013.01.09 09:26', 'yyyy.mm.dd hh24:mi'), '2'); 
insert into CON_JOURNAL values('13', to_date('2013.01.09 09:29', 'yyyy.mm.dd hh24:mi'), '6'); 

感謝你的幫助,

SK

+0

小提琴[這裏](http://sqlfiddle.com/#!4/fb9fa/0)測試 –

回答

1

有趣的問題! :-)

要總結5分鐘時間窗口內的連接,可以使用分析函數的窗口子句。舉例來說,你可以訂購一個單一的過程(PARITITION BY con_prc)由連接時間(ORDER BY con_date)的連接,並限制窗口前5分鐘(RANGE INTERVAL '5' MINUTE PRECEDING):

 SELECT con_prc , 
       COUNT(*) OVER (PARTITION BY con_prc 
           ORDER BY con_date 
           RANGE INTERVAL '5' MINUTE PRECEDING) AS connections 
      FROM con_journal 

然後,根據您的要求,選擇每個進程的最大連接數:

SELECT con_prc, MAX(connections) AS max_con 
    FROM (
     SELECT con_prc , 
       COUNT(*) OVER (PARTITION BY con_prc 
           ORDER BY con_date 
           RANGE INTERVAL '5' MINUTE PRECEDING) AS connections 
      FROM con_journal 
     ) 
GROUP BY con_prc; 

1 2 
2 2 
3 2 
4 1 
6 2 

編輯:或者,您可以創建時間片表加入某個時間片內的meaurements:

SELECT to_char(t,'HH24:MI') as t, count(con_id) as connected_sessions 
    FROM con_journal j 
    JOIN (SELECT TIMESTAMP '2013-01-09 09:00:00' + (level/24/60) as t 
      FROM dual CONNECT BY level < 60) 
    ON t BETWEEN con_date AND con_date + INTERVAL '5' MINUTE 
GROUP BY t 
ORDER BY t; 
+0

和好的迴應!從窗口+1。 –

+0

嗨,從09:22開始的5分鐘的間隔呢?有6個進程。 SK –

+0

刪除'PARTITION BY con_prc'會讓你更接近。似乎你不能使用'count(distinct con_prc)' –

相關問題