Berechnen Zeitdifferenz zwischen zwei Reihen
-
23-09-2019 - |
Frage
Ich habe eine Tabelle, die Folgendes enthält:
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 Spalt durch die zeitliche Differenz zwischen der aktuellen und den vorherige Zeile und Summe zu multiplizieren, dass für den ganzen Tag.
Ich habe zur Zeit die Daten eingerichtet in alle 10 Sekunden zu kommen, die für eine einfache Konvertierung in der Abfrage macht:
SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate
Wo @startDate und @endDate ist die heutige Datum um 00:00:00 und 11.59.59.
Bevor ich den Datensatz alle 10 Sekunden gesammelt werden sie gesammelt wurden, wenn der Wert geändert. Es gibt keine doppelten Einträge in Bezug auf Zeit, ist die minimale Zeitdifferenz 1 Sekunde.
Wie kann ich eine Abfrage einrichten, um die verstrichene Zeit zwischen den Zeilen für den Fall, wenn ich weiß nicht, das Zeitintervall zwischen den Messungen?
Ich bin mit SQL Server 2005.
Lösung
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
Andere Tipps
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