Sql Oracle每月停机时间(分钟)

Sql Oracle每月停机时间(分钟),sql,oracle,oracle11g,oracle12c,date-math,Sql,Oracle,Oracle11g,Oracle12c,Date Math,这是用Oracle 11g或12c编写的 你好, 我试图将这些数据塑造成过去12个月的停机时间,以这种方式塑造以支持图表 在下面的Oracle SQL查询中,注释查询M显示了如何每月输入一条记录。查询M显示了我所需要的最终形状,只是我需要停机时间,以进入每个月的存储箱 然而,数据是由查询D提供的,为了这个示例,我对查询D进行了模拟。当然,一个更好的示例可能会显示更多的边缘情况,例如跨越一个月的第一个月等,但是这个示例就足够了 WITH /* M AS ( SELECT ADD_

这是用Oracle 11g或12c编写的

你好,

我试图将这些数据塑造成过去12个月的停机时间,以这种方式塑造以支持图表

在下面的Oracle SQL查询中,注释查询M显示了如何每月输入一条记录。查询M显示了我所需要的最终形状,只是我需要停机时间,以进入每个月的存储箱

然而,数据是由查询D提供的,为了这个示例,我对查询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));
先谢谢你。我已经在这上面转了好几天了,是时候寻求帮助了。

试试这个:

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;

完美的非常感谢你,亚当。聪明的分组! MO DOWN_MINUTES 3/1/2016 0 2/1/2016 0 1/1/2016 0 12/1/2015 0 11/1/2015 1440 10/1/2015 0 9/1/2015 0 8/1/2015 0 7/1/2015 0 6/1/2015 0 5/1/2015 0 4/1/2015 0
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);
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;