2016-04-13 7 views
2

Dies ist in Oracle 11g oder 12c geschrieben ...Oracle Ausfallzeiten in Minuten pro Monat

Hallo,

ich diese Daten in Stunden Ausfallzeit für die letzten 12 Monate zu formen versucht bin, geformt auf diese Weise ein Diagramm zu unterstützen.

In der folgenden Oracle SQL-Abfrage zeigt die kommentierte Abfrage "M", wie pro Monat ein Datensatz eingefügt wird. Die Abfrage "M" zeigt die endgültige Form an, die ich benötige, außer dass ich die Ausfallminuten benötige, die in jede Monatsablage fallen.

Die Daten werden jedoch von der Abfrage "D" zur Verfügung gestellt, die ich wegen dieses Beispiels verspottet habe. Natürlich könnte ein besseres Beispiel mehr Kantenfälle zeigen, wie zum Beispiel den ersten eines Monats usw. Aber dieses Beispiel wird ausreichen.

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)); 

Das Ergebnis sieht nun wie folgt aus:

 
SINCE     UP_TIME   DOWN_TIME BLACKOUT_TIME       
9/25/2015 3:12:47 PM 385,392 
11/25/2015 3:12:00 PM     1,440 
11/26/2015 3:12:00 PM 200,122

aber ich brauche es wie folgt aussehen:

 
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 

PS: Zum Wohle der Gruppe, die tatsächliche Die Ausfallzeit in der Abfrage "M" wird von der folgenden Abfrage generiert, die von Oracle Enterprise Manager lautet:

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); 

Vielen Dank im Voraus. Ich habe meine Räder seit Tagen gedreht und es ist Zeit, um Hilfe zu bitten.

Antwort

1

versuchen, diese:

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; 
+0

Perfect! Vielen Dank, Adam. Clevere Gruppierung! – SMerrill8