【问题标题】:SQL Server 2008 and Almost-Progressive Sum and Average?SQL Server 2008 和几乎渐进式求和和平均?
【发布时间】:2010-12-14 21:29:03
【问题描述】:
我有一个包含几百万行的表,其中包含一个 ID 列和一个 DateTimeOffset 列。该表仅跟踪某些操作的已用时间。
在不触摸光标或不做 RBAR 的情况下,如何获得每行之间的差异,然后是所有行之间的平均时间?
例如,如果第 1 行是 12:00,第 2 行是 12:01,第 3 行是 12:03,那么我的结果集将有第 1 行和 0,第 2 行有 1,第 3 行有 2。然后我的下一个结果集的值为 1.5。
帮助?
谢谢。
【问题讨论】:
标签:
sql-server-2008
sum
average
【解决方案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
然后使用上述查询作为子查询计算平均值。
【解决方案2】:
我假设每一行都有一个标识值?
在表上建立一个外键关系回到它自己。
当你插入每一行时,你给它上一行的 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
希望这是有道理的,对你有用
体重
【解决方案3】:
假设每个标识值仅比前一个大 1,您可以使用子查询执行以下操作:
select testdate, DATEDIFF(SECOND, TestDate,
(select TestDate from TestDates tdIn where tdIn.TestId = tdOut.TestId + 1))
from TestDates tdOut