Domanda

Ho una tabella che contiene il seguente:

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.

Io attualmente ho i dati istituito per 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 devono essere raccolti ogni 10 secondi sono stati raccolti ogni volta che il valore modificato. Non ci sono voci duplicate in termini di tempo, la differenza di tempo minimo è di 1 secondo.

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

Sto usando SQL Server 2005.

È stato utile?

Soluzione

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

Altri suggerimenti

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

SELECT
      DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM  rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top