Oracle суммирует данные с 15-секундным интервалом - PullRequest
0 голосов
/ 24 октября 2018

Я хочу суммировать приведенный ниже запрос с 15-секундными временными интервалами.

select to_char(sample_time,'hh24:mi:ss') as SAMPLE_TIME,nvl(wait_class,'CPU'),count(*) 
from gv$active_session_history 
group by wait_class,sample_time;

Результат;

SAMPLE_TIME    WAITS   COUNT
-----------------------------
14:59:00        CPU     3
14:59:02        CPU     1
14:59:08        CPU     2
14:58:11        CPU     2
14:59:18        CPU     1
14:59:24        CPU     2
14:58:29        CPU     2

Я хочу суммировать значения с 15-секундными интервалами.Как я могу это сделать?

SAMPLE_TIME    WAITS   COUNT
-----------------------------
14:59:15        CPU     8
14:59:30        CPU     5   

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Это выглядит немного хакерской, но это должно быть то, что вы ищете.Lpad просто для лучшего результата.

Редактировать: Забыл сгруппировать по фактическому утверждению, а не по sample_time .Теперь он должен группироваться с интервалами в 15 секунд.

select 
    to_char(sample_time, 'hh24:mi:') || lpad(trunc(to_number(to_char(sample_time, 'ss')) / 15) * 15, 2, '0') as SAMPLE_TIME,
    nvl(wait_class, 'CPU') as wait_class,
    count(*) 
from gv$active_session_history 
group by nvl(wait_class, 'CPU'), to_char(sample_time, 'hh24:mi:') || lpad(trunc(to_number(to_char(sample_time, 'ss')) / 15) * 15, 2, '0')
0 голосов
/ 24 октября 2018

- не могу добавлять комментарии, потому что мой представитель очень низкий

@ Wernfried Domscheit дал вам всю необходимую информацию, я взял его комментарии и просто «ударил» их по группе по части вашего запроса(и, очевидно, необходимо добавить определение сегмента в операторе select)

Приведенный ниже код позволит вам проверить ответ Вернфрида:

select TO_CHAR(TRUNC(SAMPLE_TIME, 'mi') + TRUNC(EXTRACT(SECOND FROM SAMPLE_TIME) /
EXTRACT(SECOND FROM INTERVAL '15' SECOND)) * EXTRACT(SECOND FROM INTERVAL '15' 
SECOND) *     INTERVAL '1' SECOND,'MM/DD/YYYY HH24:MI:SS') AS TimeBucket
,  nvl(wait_class,'CPU')
,count(*) as NbrRecords
from gv$active_session_history 
GROUP BY TO_CHAR(TRUNC(SAMPLE_TIME, 'mi') + TRUNC(EXTRACT(SECOND FROM SAMPLE_TIME) /
 EXTRACT(SECOND FROM INTERVAL '15' SECOND)) * EXTRACT(SECOND FROM INTERVAL '15' 
SECOND) *     INTERVAL '1' SECOND,'MM/DD/YYYY HH24:MI:SS'), nvl(wait_class,'CPU')
ORDER BY TimeBucket DESC
;

HTH,

B

0 голосов
/ 24 октября 2018

Используйте эту функцию:

CREATE OR REPLACE FUNCTION MakeInterval(ts IN TIMESTAMP, roundInterval IN INTERVAL DAY TO SECOND) RETURN TIMESTAMP DETERMINISTIC IS
    denom INTEGER;
BEGIN
    IF roundInterval >= INTERVAL '1' HOUR THEN
        denom := EXTRACT(HOUR FROM roundInterval);
        IF MOD(24, denom) <> 0 THEN
            RAISE VALUE_ERROR;
        END IF;
        RETURN TRUNC(ts) + TRUNC(EXTRACT(HOUR FROM ts) / denom) * denom * INTERVAL '1' HOUR;
    ELSIF roundInterval >= INTERVAL '1' MINUTE THEN
        denom := EXTRACT(MINUTE FROM roundInterval);
        IF MOD(60, denom) <> 0 THEN
            RAISE VALUE_ERROR;
        END IF;
        RETURN TRUNC(ts, 'hh') + TRUNC(EXTRACT(MINUTE FROM ts) / denom) * denom * INTERVAL '1' MINUTE;
    ELSE
        denom := EXTRACT(SECOND FROM roundInterval);                
        IF MOD(60, denom) <> 0 THEN
            RAISE VALUE_ERROR;
        END IF;
        RETURN TRUNC(ts, 'mi') + TRUNC(EXTRACT(SECOND FROM ts) / denom) * denom * INTERVAL '1' SECOND;
    END IF;
END MakeInterval;

Тогда вы можете использовать

...
GROUP BY wait_class, MakeInterval(SAMPLE_TIME, INTERVAL '15' SECOND)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...