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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top