2016-07-15 14 views
0

Ich habe eine Tabelle mit Prozessdaten enthält Nazwa, Wartosc, Czas. Die Tabellendaten sehen so etwas wie thisSumme der Differenz (Zeit) zwischen zwei Datensätze zu berechnen - mssql

Jetzt habe ich query:

;WITH [cteRows] AS 
(
    SELECT [nazwa], 
      [wartosc], 
      [czas], 
      ROW_NUMBER() OVER (ORDER BY [czas]) AS [RowNumber] 
    FROM [test].[dbo].[coldbox7] 
    WHERE [nazwa] = 'coldbox7/WymianaDanychDB/Hydraulic' 
    AND [czas] >= '2016-07-14 22:00:00.000' 
    AND [czas] <= '2016-07-14 22:30:00.000' 
) 
SELECT mc.[RowNumber], 
     mc.[czas], 
     mc.[nazwa], 
     mc.[wartosc], 
     DATEDIFF(SECOND, mc.[czas], ISNULL(mp.[czas], mc.[czas])) AS [Wsekundach] 
FROM [cteRows] mc 
LEFT JOIN [cteRows] mp 
    ON mc.[RowNumber] = mp.[RowNumber] + 1 
WHERE mc.[wartosc] = 0 

Und Ausgang look like:

I Frage: Wie kann ich eine Zeile Summe von [Wsekundach] machen, anstatt aktuelle Ausgangs ?

+0

Da die anderen Spalten in allen Zeilen unterschiedliche Daten enthalten: Welche Informationen möchten Sie dort anzeigen, wenn das Ergebnis auf eine einzelne Zeile reduziert wird? – Shnugo

+0

Ich hätte Informationen über alle Zeitdifferenz. [Wsekundach] –

+0

Wird das nicht nur der Unterschied zwischen der ersten und der letzten Reihe sein? –

Antwort

0

Versuchen folgende:

;WITH [cteRows] AS 
(
    SELECT [nazwa], 
      [wartosc], 
      [czas], 
      ROW_NUMBER() OVER (ORDER BY [czas]) AS [RowNumber] 
    FROM [test].[dbo].[coldbox7] 
    WHERE [nazwa] = 'coldbox7/WymianaDanychDB/Hydraulic' 
    AND [czas] >= '2016-07-14 22:00:00.000' 
    AND [czas] <= '2016-07-14 22:30:00.000' 
) 

, cteNewRows AS 
(
    SELECT mc.[RowNumber], 
      mc.[czas], 
      mc.[nazwa], 
      mc.[wartosc], 
      DATEDIFF(SECOND, mc.[czas], ISNULL(mp.[czas], mc.[czas])) AS [Wsekundach] 
    FROM [cteRows] mc 
    LEFT JOIN [cteRows] mp ON mc.[RowNumber] = mp.[RowNumber] + 1 
    WHERE mc.[wartosc] = 0 
) 

SELECT SUM(Wsekundach) AS SumOfWsekundach 
FROM cteNewRows 
+0

Ich habe einen Fehler in Zeile: ; MIT cteNewRows AS Falsche Syntax in der Nähe von ';'. –

+0

@ G.Dabrowski, die Abfrage bearbeitet. –

+0

super danke, und könntest du mir auch sagen, wie kann ich machen, dass, wenn die letzte Zeile wartosc = 1 als zu [Wsekundach] hinzufügen, wie lang ist zwischen datetime von 7. Zeilen und '2016-07-14 22:30: 00.000 ' –

0

Wenn Sie eine Zeile möchten, dass der Unterschied ist, glaube ich Ihnen eine viel einfachere Abfrage verwenden können:

 SELECT DATEDIFF(SECOND, MIN(c.[czas]), MAX(c.[czas]) 
     FROM [test].[dbo].[coldbox7] c 
     WHERE [nazwa] = 'coldbox7/WymianaDanychDB/Hydraulic' AND 
      [czas] >= '2016-07-14 22:00:00.000' AND 
      [czas] <= '2016-07-14 22:30:00.000' AND 
      c.[wartosc] = 0; 

Dadurch könnte die Summe nur auf die maximale basiert und Minimum ist viel effizienter als das Addieren der Zwischensummen.

Verwandte Themen