![](/img/trans.png)
[英]How to get average time interval ( 5 min ) or number of records using BigQuery
[英]Get the maximum number of processes connected in a time interval
我們有連接到子系統的進程,並且正在通過此時間戳進行跟蹤。 我想找出的是在N分鍾的時間間隔內已連接的最大進程數。
該時間間隔是進程的超時間隔,因此,經過時間的倒計時在連接時開始。 因此,該時間間隔是“浮動”時間間隔。
為簡單起見,此間隔的長度為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');
這是CONNECTIONS表的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
有趣的問題! :-)
要在5分鍾的時間范圍內總結連接,可以使用分析函數的windowing子句。 例如,您可以按連接時間( ORDER BY con_date
)對單個進程的連接( 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
編輯:或者,您可以創建一個時間片表,以加入一個時間片內的度量:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.