Подтвердить что ты не робот

Вычислить разницу во времени между двумя строками

У меня есть таблица, содержащая следующее:

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

Мне нужно умножить столбец значений на разницу во времени между текущей и предыдущими строками и суммировать это за весь день.

В настоящее время у меня есть данные, установленные каждые 10 секунд, что упрощает преобразование в запросе:

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

Где @startDate и @endDate сегодня дата в 00:00:00 и 11:59:59.

Прежде чем я установил данные, которые будут собираться каждые 10 секунд, он собирался всякий раз, когда значение менялось. Нет никаких повторяющихся записей с точки зрения времени, минимальная разница во времени составляет 1 секунду.

Как настроить запрос для получения прошедшего времени между строками для случая, когда я не знаю интервал времени между показаниями?

Я использую SQL Server 2005.

4b9b3361

Ответ 1

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

В 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

Ответ 2

Небольшая настройка Quassnoi-запроса, если вы предпочитаете не использовать Subselect, будет:

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