Calcule a diferença de tempo entre duas linhas
-
23-09-2019 - |
Pergunta
Eu tenho uma tabela que contém o seguinte:
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
. .
. .
. .
Preciso multiplicar a coluna de valor pela diferença de tempo entre as linhas atuais e anteriores e resumir isso durante todo o dia.
Atualmente, tenho os dados configurados para vir a cada 10 segundos, o que contribui para uma simples conversão na consulta:
SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate
Onde @startdate e @enddate estão na data de hoje às 00:00:00 e 11:59:59.
Antes de definir os dados a serem coletados a cada 10 segundos, foram coletados sempre que o valor mudou. Não há entradas duplicadas em termos de tempo, a diferença de horário mínima é de 1 segundo.
Como posso configurar uma consulta para obter o tempo decorrido entre as linhas para o caso quando não sei o intervalo de tempo entre as leituras?
Estou usando o SQL Server 2005.
Solução
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
No 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
Outras dicas
Um pequeno ajuste na consulta de Quassnoi, se você preferir não usar um subseleto: seria:
SELECT
DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL