2010-03-01 23 views
41

ich eine Tabelle, die enthält folgende Komponenten:berechnen Zeitdifferenz zwischen zwei Reihen

DataDate     Value 
2010-03-01 08:31:32.000 100 
2010-03-01 08:31:40.000 110 
2010-03-01 08:31:42.000 95 
2010-03-01 08:31:45.000 101 
.      . 
.      . 
.      . 

Ich brauche den Wert Spalte durch die zeitliche Differenz zwischen dem aktuellen und dem vorherigen Zeilen zu multiplizieren und summieren, dass für den ganzen Tag .

ich haben derzeit die Daten einrichten in alle 10 Sekunden kommen, die in der Abfrage für eine einfache Konvertierung macht:

SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate 

Wo @startDate und @endDate um 00:00:00 heutigen Datum sind und 11:59:59.

Bevor ich die zu sammelnden Daten alle 10 Sekunden einstellte, wurde sie gesammelt, sobald sich der Wert änderte. Es gibt keine doppelten Einträge in Bezug auf die Zeit, die minimale Zeitdifferenz beträgt 1 Sekunde.

Wie kann ich eine Abfrage einrichten, um die verstrichene Zeit zwischen den Zeilen für den Fall zu erhalten, wenn ich das Zeitintervall zwischen den Messungen nicht kenne?

Ich bin mit SQL Server 2005.

Antwort

116
WITH rows AS 
     (
     SELECT *, ROW_NUMBER() OVER (ORDER BY DataDate) AS rn 
     FROM mytable 
     ) 
SELECT DATEDIFF(second, mc.DataDate, mp.DataDate) 
FROM rows mc 
JOIN rows mp 
ON  mc.rn = mp.rn - 1 

In SQL Server 2012+:

SELECT DATEDIFF(second, pDataDate, dataDate) 
FROM (
     SELECT *, 
       LAG(dataDate) OVER (ORDER BY dataDate) pDataDate 
     FROM rows 
     ) q 
WHERE pDataDate IS NOT NULL 
+1

Verdammt das ist nützlich. Ich wusste nicht, dass ich es so machen könnte, und jetzt muss ich vielleicht ein paar Fragen ändern :) –

+0

Ich liebe Lösungen wie diese, einfach und effektiv. – ChandlerPelhams

+0

Awesomeoness, ich wünschte, ich hätte eine Taste +10. – vikingsteve

1

Ein wenig zwicken auf Quassnoi Abfrage, ob Sie nicht lieber einen Subselect verwenden wäre:

SELECT 
     DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate) 
FROM rows 
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL 
Verwandte Themen