2010-03-01 19 views
41

Tengo una tabla que contiene lo siguiente:Diferencia Calcular tiempo entre dos filas

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

I necesidad de multiplicar la columna de valor por la diferencia de tiempo entre las filas actuales y anteriores y resumir que durante todo el día .

que actualmente tiene el conjunto de datos de hasta venir en cada 10 segundos, lo que lo convierte en un simple conversión en la consulta:

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

Dónde @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.

Respuesta

116
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 
+1

Maldición que es útil. No me di cuenta de que podía hacerlo de esa manera, y ahora podría tener que cambiar algunas consultas :) –

+0

Me encantan las soluciones como esta, simples y efectivas. – ChandlerPelhams

+0

Awesomeoness, desearía tener un botón +10. – vikingsteve

1

Un pequeño arreglo en la consulta del Quassnoi si usted prefiere no utilizar un Subseleccionar sería:

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