sql server - pasar - Calcular la diferencia de tiempo entre dos filas
pasar filas a columnas sql server sin pivot (2)
Tengo una tabla que contiene lo siguiente:
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
. .
. .
. .
Necesito multiplicar la columna de valor por la diferencia de tiempo entre las filas actual y anterior y sumar eso para todo el día.
Actualmente tengo la configuración de datos por venir cada 10 segundos, lo que hace una conversión simple en la consulta:
SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate
Donde @startDate y @endDate son la fecha de hoy a las 00:00:00 y 11:59:59.
Antes de configurar los datos que se recopilarían cada 10 segundos, se recopilaban cada vez que cambiaba el valor. No hay entradas duplicadas en términos de tiempo, la diferencia de tiempo mínima es de 1 segundo.
¿Cómo puedo configurar una consulta para obtener el tiempo transcurrido entre filas para el caso cuando no sé el intervalo de tiempo entre las lecturas?
Estoy usando 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
En 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 pequeño ajuste en la consulta de Quassnoi si prefiere no usar una Subselección sería:
SELECT
DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL