2017-07-18 5 views
-1

Verwenden von SQL Server 2008 R2.Prozentuale Zusammenfassung pro Stunde für 24 Stunden

Ich versuche, eine prozentuale Up-Zeit für einen 24-Stunden-Zeitraum pro Stunde zu erhalten.

Wenn die Spalte AlertID 1 ist, ist das System aktiv. Wenn AlertID eine andere Nummer ist, wird sie als inaktiv betrachtet.

Hier ist, was ich derzeit nicht funktioniert und hat ein schlechtes Ergebnis, aber lassen Sie uns es zuerst machen. Die UpTime Spalte ist immer 0.

SELECT a.dayhour, 
     ((SELECT Count(*) 
      FROM commandhistory 
      WHERE commandid = '4263745C-5603-4E3D-AFB2-CA0E27969D0B' 
       AND alertid = 1 
       AND Datepart(hour, recordeddttm) = a.dayhour * 100)/(SELECT 
     Count(*) FROM commandhistory 
     WHERE commandid = '4263745C-5603-4E3D-AFB2-CA0E27969D0B' 
      AND Datepart(hour, recordeddttm) = a.dayhour)) AS UpTime 
FROM (SELECT 0 AS DayHour UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23) a 
     LEFT JOIN commandhistory h 
       ON a.dayhour = Datepart(hour, recordeddttm) 
GROUP BY a.dayhour 
ORDER BY a.dayhour 

Beispiel Tabelle: (es andere Daten, aber ich für diese Instanz darüber do not care)

uniqueidentifier CommandID 
smallint   AlertID 
datetime   RecordedDTTM 

alertId 1-5 sein kann. 1 bedeutet, dass es oben ist, jede andere Nummer sollte als down behandelt werden.

+0

nicht sicher, warum jemand diese als geschlossene Liste steht. Habe ich etwas verpasst? – Tsukasa

+1

Es ist eine Bewegung Abstimmung zu dba.stackexchange.com, also nicht wirklich eine enge Abstimmung. Die Performance-Tuning-Experten leben dort, also macht es Sinn. –

+0

Schema und Beispieldaten würden dies viel einfacher zu beheben. – Jacobm001

Antwort

1

, wie dies etwa:

;with cte as 
(
SELECT Datepart(hour, recordeddttm) as DayHour 
    , sum(case when alertID=1 then 1 else 0 end) as UpTimeCt 
    , sum(case when alertID <> 1 then 1 else 0 end) as DownTimeCt 
    , Count(*) AllCt 
FROM commandhistory 
WHERE commandid = '4263745C-5603-4E3D-AFB2-CA0E27969D0B' 
--AND cast(recordeddttm as date) = [some date] --This is optional but limits data set 
group by Datepart(hour, recordeddttm) 
) 

select DayHour 
    , UpTimeCt 
    , UpTimeRate = UpTimeCt/AllCt --AllCt might need to be cast 
    , DownTimeCt 
    , DownTimeRate = DownTimeCt/AllCt --AllCt might need to be cast 
from cte 
+0

Perfekt, ging es in die falsche Richtung. – Tsukasa