Question

J'ai une table qui contient les éléments suivants:

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 besoin de multiplier la colonne de valeur de la différence de temps entre les rangées actuelle et précédente et que la somme pour toute la journée.

J'ai actuellement les données mis en place pour venir toutes les 10 secondes, ce qui rend pour une simple conversion dans la requête:

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

Où @StartDate et @EndDate sont la date d'aujourd'hui à 00:00:00 et 11:59:59.

Avant définir les données à recueillir toutes les 10 secondes ils ont été recueillis chaque fois que la valeur modifiée. Il n'y a pas d'entrées en double en termes de temps, la différence de temps minimum est de 1 seconde.

Comment puis-je configurer une requête pour obtenir le temps écoulé entre les lignes pour le cas où je ne sais pas l'intervalle de temps entre les lectures?

J'utilise SQL Server 2005.

Était-ce utile?

La solution

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

Dans 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

Autres conseils

Un peu tweak sur la requête de Quassnoi si vous préférez ne pas utiliser une sous-sélection serait:

SELECT
      DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM  rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top