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