Время простоя 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;
Другие вопросы по тегам