2010-03-01 17 views
41

Ho una tabella che contiene i seguenti:Calcolare il tempo differenza tra due file

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

Ho bisogno di moltiplicare la colonna valore dalla differenza di tempo tra le file attuali e precedenti e somma che per l'intera giornata .

ho attualmente il set di dati fino a venire in ogni 10 secondi che rende per una semplice conversione nella query:

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

Dove @StartDate e @EndDate sono data odierna alle 00:00:00 e 11:59:59.

Prima di impostare i dati da raccogliere ogni 10 secondi è stato raccolto ogni volta che il valore è cambiato. Non ci sono voci duplicate in termini di tempo, la differenza temporale minima è 1 secondo.

Come posso impostare una query per ottenere il tempo trascorso tra le righe per il caso in cui non conosco l'intervallo di tempo tra le letture?

Sto usando SQL Server 2005.

risposta

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 

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

Dannazione utile. Non mi ero reso conto che avrei potuto farlo in quel modo, e ora potrei semplicemente cambiare qualche domanda :) –

+0

Amo le soluzioni come questa, semplice ed efficace. – ChandlerPelhams

+0

Awesomeoness, vorrei avere un pulsante +10. – vikingsteve

1

Un piccolo trucco su richiesta del Quassnoi se si preferisce non utilizzare un Sottoseleziona sarebbe:

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