2010-12-14 2 views
1

У меня есть таблица с несколькими миллионами строк с столбцом ID и столбцом DateTimeOffset. Таблица просто отслеживает прошедшее время для некоторых операций.SQL Server 2008 и почти прогрессивная сумма и средняя?

Не касаясь курсора или делая RBAR, как я могу получить разницу между каждой строкой, а затем среднее время между всеми строками?

Например, если строка 1 равна 12:00, а строка 2 - 12:01, а строка 3 - 12:03, тогда мой результирующий набор будет иметь строку 1 с 0, строкой 2 с 1 и строкой 3 с 2. Тогда мой следующий результат будет иметь значение 1.5.

Помогите?

Спасибо.

ответ

1

Я думаю, что вы могли бы сделать это, вступив на номерах строк, что-то вроде:

WITH datanumbered AS (
    SELECT dateValue, ROW_NUMBER() OVER (ORDER BY dateValue) AS rownum 
) 
SELECT first.rownum, DATEDIFF(second, first.dateValue, second.dateValue) AS TimeDiff 
FROM datenumbered first 
    JOIN datenumbered second ON first.rownum = second.rownum - 1 

Затем вычислить среднее значение с помощью abo в качестве подзапроса.

0

Я предполагаю, что каждая строка имеет идентификационное значение?
Имейте отношение forign key на столе назад к себе.

Когда вы вставляете каждую строку, вы даете ей Fk предыдущей строки.

Затем вы можете присоединиться к столу обратно к себе, например.

Select row2.Offset - row1.Offset from Offsets row1 inner join Offsets row2 
on row1.IdentityCol = row2.ForignKeyCol 

последней строка

Select avg(row2.Offset - row1.Offset) from Offsets row1 inner join Offsets row2 
on row1.IdentityCol = row2.ForignKeyCol 

Надеется, что это имеет смысл и вам полезно
BW

0

Предполагая, что каждое значение идентичности является только 1 больше, чем предыдущий, вы можете сделать что-то с помощью подзапросов так:

select testdate, DATEDIFF(SECOND, TestDate, 
    (select TestDate from TestDates tdIn where tdIn.TestId = tdOut.TestId + 1)) 
from TestDates tdOut