2016-08-15 1 views
1

Ich habe eine Abfrage, die mir die Anzahl der Sekunden zwischen Zeitstempeln für Ereignisse im Produktionslauf einer bestimmten Maschine zurückgibt.Summe der verstrichenen Zeit zwischen Zeitstempeln SQL Server

Ich möchte die gesamte Zeit gruppiert durch den statusCode der Maschine während dieser Dauer. Ex. Betrieb, ungeplante Ausfallzeiten, geplante Ausfallzeiten.

Ich denke, dass dies ein Aggregat eines Aggregats beinhaltet, das ich weiß, ist nicht erlaubt. Ich bin sicher, dass es einen Weg gibt, dies aber

SELECT 
    p1.productionRunId, 
    p1.statusCodeId, 
    DATEDIFF(SECOND, MAX(p2.startTime), p1.startTime) AS seconds 
FROM 
    productionLog p1 
INNER JOIN 
    wincc.dbo.productionLog p2 ON p1.productionRunId = p2.productionRunId 
           AND p2.startTime < p1.startTime 
GROUP BY 
    p1.startTime, p1.productionRunId, p1.statusCodeId 

Here is a picture of my current results with a description of what I would like.

+0

entfernen Sie 'p.startTime' aus' group by'. –

Antwort

1

Ich glaube, Sie fast musste es zu tun. Sie können die obige SELECT-Abfrage als Unterabfrage einer anderen Abfrage verwenden, um die Zeiträume zu summieren. Sehen Sie, ob das das Richtige für Sie ist:

declare @p table (startTime datetime, productionRunId int, statusCodeId int) 

insert @p values 
('1/1/2016 15:43:00', 1, 1), 
('1/1/2016 15:43:05', 1, 1), 
('1/1/2016 15:43:01', 2, 2), 
('1/1/2016 15:43:09', 2, 2), 
('1/1/2016 15:44:02', 2, 2), 
('1/1/2016 15:44:09', 2, 2), 
('1/1/2016 15:44:31', 3, 1), 
('1/1/2016 15:44:45', 3, 1) 

SELECT 
    productionRunId, 
    statusCodeId, 
    SUM(seconds) AS totalSeconds 
FROM (
    SELECT 
     p1.productionRunId, 
     p1.statusCodeId, 
     DATEDIFF(SECOND, MAX(p2.startTime), p1.startTime) AS seconds 
    FROM @p p1 
    INNER JOIN @p p2 ON p1.productionRunId = p2.productionRunId 
    AND p2.startTime < p1.startTime 
    GROUP BY 
     p1.startTime, 
     p1.productionRunId, 
     p1.statusCodeId 
) AS ElapsedPeriods 
GROUP BY 
    productionRunId, 
    statusCodeId 
+0

Vielen Dank !! Das war's. –

+0

@ZackScriven - wenn dies die/Ihre Antwort war, markieren Sie sie bitte mit dem grauen Kästchen auf der linken Seite der Antwort. – Igor

Verwandte Themen