SQL Server 2008 и почти прогрессивная сумма и среднее? - PullRequest
1 голос
/ 15 декабря 2010

У меня есть таблица с несколькими миллионами строк, со столбцом ID и столбцом DateTimeOffset.Таблица просто отслеживает прошедшее время для некоторых операций.

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

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

Справка?

Спасибо.

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

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

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

Затем вычислите среднее значение, используя указанный выше запрос в качестве подзапроса.

0 голосов
/ 15 декабря 2010

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

select testdate, DATEDIFF(SECOND, TestDate, 
     (select TestDate from TestDates tdIn where tdIn.TestId = tdOut.TestId + 1))
from TestDates tdOut
0 голосов
/ 15 декабря 2010

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

Когда вы вставляете каждую строку, вы даете ей 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

...