web-dev-qa-db-fra.com

Calculer la différence de temps entre deux lignes

J'ai un tableau qui contient les éléments suivants:

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
.                        .
.                        .
.                        .

J'ai besoin de multiplier la colonne de valeur par la différence de temps entre les lignes actuelles et précédentes et de les additionner pour toute la journée.

J'ai actuellement les données configurées pour venir toutes les 10 secondes, ce qui permet une conversion simple dans la requête:

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

Où @startDate et @endDate sont la date d'aujourd'hui à 00:00:00 et 11:59:59.

Avant de définir les données à collecter toutes les 10 secondes, elles étaient collectées chaque fois que la valeur changeait. Il n'y a pas d'entrées en double en termes de temps, le décalage horaire minimum est de 1 seconde.

Comment puis-je configurer une requête pour obtenir le temps écoulé entre les lignes pour le cas lorsque je ne connais pas l'intervalle de temps entre les lectures?

J'utilise SQL Server 2005.

46
amarcy
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

Dans 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
133
Quassnoi

Un petit ajustement sur la requête de Quassnoi si vous préférez ne pas utiliser de sous-sélection serait:

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