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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top