Вычислить разницу во времени между двумя строками
У меня есть таблица, содержащая следующее:
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.
Ответы
Ответ 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