Время простоя Oracle в минутах в месяц
Это написано в Oracle 11g или 12c...
Привет,
Я пытаюсь преобразовать эти данные в часы простоя в течение предыдущих 12 месяцев, таким образом, чтобы поддерживать график.
В приведенном ниже SQL-запросе Oracle закомментированный запрос "M" показывает, как вводить одну запись в месяц. Запрос "M" показывает окончательную форму, которая мне нужна, за исключением того, что мне нужны минуты простоя, чтобы попасть в каждую месячную корзину.
Данные, однако, предоставляются запросом "D", который я смоделировал для примера. Конечно, лучший пример может показать больше крайних случаев, таких как охват первого месяца и т. Д. Но этого примера будет достаточно.
WITH
/*
M AS (
SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), -1 * LEVEL) AS MO
, 0 AS DOWNTIME FROM DUAL
CONNECT BY LEVEL <= 12),
*/
D AS ( -- data simulating a downtime day
SELECT 'Target Up' AS AVAILABILITY_STATUS,
TO_DATE ('9/25/2015 15:12:47', 'MM/DD/YYYY HH24:MI:SS')
AS SINCE,
385392 AS MINUTES
FROM DUAL
UNION ALL
SELECT 'Target Down' AS AVAILABILITY_STATUS,
TO_DATE ('11/25/2015 15:12:00', 'MM/DD/YYYY HH24:MI:SS')
AS SINCE,
1440 AS MINUTES
FROM DUAL
UNION ALL
SELECT 'Target Up' AS AVAILABILITY_STATUS,
TO_DATE ('11/26/2015 15:12:00', 'MM/DD/YYYY HH24:MI:SS')
AS SINCE,
200122 AS MINUTES
FROM DUAL)
SELECT *
FROM D
PIVOT
(SUM (MINUTES)
AS TIME
FOR AVAILABILITY_STATUS
IN ('Target Up' AS UP,
'Target Down' AS DOWN,
'Blackout' AS BLACKOUT));
Результат теперь выглядит так:
ПОСЛЕ UP_TIME DOWN_TIME BLACKOUT_TIME 25.0 9.2015 15:12:47 385 392 25.11.2015 15:12 1440 26.11.2015 3:12:00 200,122
но мне нужно, чтобы это выглядело так:
МО DOWN_MINUTES 01.03.2016 0 01.02.2016 0 01.01.2016 0 01.12.2015 0 01.11.2015 1440 01.10.2015 0 01.0 9.2015 0 01.0 8.2015 0 01.0 7.2015 0 01.0 6.2015 0 01.05.2015 0 01.0 4.2015 0
PS: В интересах группы фактическое время простоя в запросе "M" генерируется следующим запросом, который читает из Oracle Enterprise Manager:
WITH X
AS (SELECT START_TIMESTAMP,
NVL (END_TIMESTAMP, SYSDATE) AS END_TIMESTAMP,
AVAILABILITY_STATUS,
TRUNC (
(NVL (END_TIMESTAMP, SYSDATE) - START_TIMESTAMP) * 24 * 60)
MINUTES
FROM MGMT$AVAILABILITY_HISTORY
WHERE AVAILABILITY_STATUS IN
('Target Down', 'Target Up', 'Blackout')
)
SELECT AVAILABILITY_STATUS,
MIN (START_TIMESTAMP) AS SINCE,
SUM (MINUTES) AS MINUTES
FROM X
GROUP BY AVAILABILITY_STATUS
ORDER BY MIN (START_TIMESTAMP);
Заранее спасибо. Я крутил свои колеса на этом в течение нескольких дней, и пришло время обратиться за помощью.
1 ответ
Попробуй это:
WITH
M AS (
SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), -1 * LEVEL) AS MO
, 0 AS DOWNTIME FROM DUAL
CONNECT BY LEVEL <= 12),
D AS ( -- data simulating a downtime day
SELECT 'Target Up' AS AVAILABILITY_STATUS,
TO_DATE ('9/25/2015 15:12:47', 'MM/DD/YYYY HH24:MI:SS')
AS SINCE,
385392 AS MINUTES
FROM DUAL
UNION ALL
SELECT 'Target Down' AS AVAILABILITY_STATUS,
TO_DATE ('11/25/2015 15:12:00', 'MM/DD/YYYY HH24:MI:SS')
AS SINCE,
1440 AS MINUTES
FROM DUAL
UNION ALL
SELECT 'Target Up' AS AVAILABILITY_STATUS,
TO_DATE ('11/26/2015 15:12:00', 'MM/DD/YYYY HH24:MI:SS')
AS SINCE,
200122 AS MINUTES
FROM DUAL)
SELECT M.mo, Nvl(s, 0) AS minutes
FROM M
LEFT JOIN ( SELECT TRUNC (SINCE, 'MONTH') AS D, SUM (MINUTES) AS S
FROM D
WHERE AVAILABILITY_STATUS = 'Target Down'
GROUP BY TRUNC (SINCE, 'MONTH')) GR
ON GR.D = M.MO
ORDER BY 1;