Рассчитайте разницу во времени между двумя рядами - PullRequest
46 голосов
/ 01 марта 2010

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

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.

Ответы [ 2 ]

131 голосов
/ 01 марта 2010
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
4 голосов
/ 27 марта 2017

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

SELECT
      DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM  rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...