有与列的表如下:SQL - 查询返回的结果
Id : long autoincrement;
timestamp:long;
price:long
时间戳给出的毫秒unix_time。
问:是什么记录之间的平均时间差?
有与列的表如下:SQL - 查询返回的结果
Id : long autoincrement;
timestamp:long;
price:long
时间戳给出的毫秒unix_time。
问:是什么记录之间的平均时间差?
在SQL Server中,你可以写类似的东西来获取信息:
SELECT
t1.ID, t2.ID,
DATEDIFF(MILLISECOND, t2.PriceTime, test2.PriceTime)
FROM table t1
INNER JOIN table t2 ON t2.ID = t1.ID-1
WHERE t1.ID > (SELECT MIN(ID) FROM table)
,如果你”再只关心在所有条目的AVG,您可以使用:
SELECT
AVG(DATEDIFF(MILLISECOND, t2.PriceTime, test2.PriceTime))
FROM table t1
INNER JOIN table t2 ON t2.ID = t1.ID-1
WHERE t1.ID > (SELECT MIN(ID) FROM table)
基本上,你需要加入表本身,并使用“t1.ID = t2.ID-1”项目没有关联。 2在一个表中,产品编号1在另一个表中,然后计算两者之间的时间差。为了避免访问项目编号。 0不存在,使用“T1.ID>(SELECT MIN(ID)FROM表)”子句从第二项开始。
马克
这只有在Id中没有空白的情况下才有效。 – 2009-08-13 11:50:55
@亚当:真的 - 好点 – 2009-08-13 11:52:35
好的,所以这意味着它确实有效 - 参见OP的评论 - 因为它是一个“AUTOINCREMENT”列,所以很可能没有差距(尽管不能保证是这样:-) ) – 2009-08-13 12:14:00
在猜测:
SELECT AVG(timestamp)
我认为你需要提供更多的信息,你的问题我们会全力协助。
假设有n条记录。 问题就像记录之间的平均时差? 在这里,棘手的是记录之间的差异。 凸轮你告诉我什么样的信息,你需要更多? – Siv 2009-08-13 11:41:41
如果你的意思是每个-其他行之间的差异:
select AVG(x) from (
select a.timestamp - b.timestamp as x
from table a, table b -- this multiplies a*b) sub
首先想到的是子查询抓取记录马上上一篇:
SELECT timestamp -
(select top 1 timestamp from Table T1 where T1.Id < Table.Id order by Id desc)
FROM Table
然后你就可以走的,平均:
SELECT AVG(delta)
from (SELECT timestamp -
(select top 1 timestamp from Table T1 where T1.Id < Table.Id order by Id desc) as delta
FROM Table) T
有可能需要对第一行的结果进行一些处理,但我还没有测试过。
您需要将“前1名”部分调整为与Oracle相同,因为我已经与Oracle合作过了很长时间。 – 2009-08-13 11:59:22
试试这个
Select Avg(E.Timestamp - B.Timestamp)
From Table B Join Table E
On E.Timestamp =
(Select Max(Timestamp)
From Table
Where Timestamp < R.Timestamp)
Oracle 10g数据库。 – Siv 2009-08-13 11:56:37
@Marc,你的第二个查询给出了正确的结果。 感谢一吨。 – Siv 2009-08-13 12:03:49
OK,未删除我的回答让您可以给予好评它:-)谢谢! 但要知道亚当的评论这是完全正确的 - 如果ID是连续的,并没有在其中任何空隙我的查询才有效。 – 2009-08-13 12:14:36