2009-08-13 173 views
0

有与列的表如下:SQL - 查询返回的结果

Id : long autoincrement; 
timestamp:long; 
price:long 

时间戳给出的毫秒unix_time。

问:是什么记录之间的平均时间差?

+0

Oracle 10g数据库。 – Siv 2009-08-13 11:56:37

+0

@Marc,你的第二个查询给出了正确的结果。 感谢一吨。 – Siv 2009-08-13 12:03:49

+0

OK,未删除我的回答让您可以给予好评它:-)谢谢! 但要知道亚当的评论这是完全正确的 - 如果ID是连续的,并没有在其中任何空隙我的查询才有效。 – 2009-08-13 12:14:36

回答

1

在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表)”子句从第二项开始。

马克

+2

这只有在Id中没有空白的情况下才有效。 – 2009-08-13 11:50:55

+0

@亚当:真的 - 好点 – 2009-08-13 11:52:35

+0

好的,所以这意味着它确实有效 - 参见OP的评论 - 因为它是一个“AUTOINCREMENT”列,所以很可能没有差距(尽管不能保证是这样:-) ) – 2009-08-13 12:14:00

0

在猜测:

SELECT AVG(timestamp)

我认为你需要提供更多的信息,你的问题我们会全力协助。

+0

假设有n条记录。 问题就像记录之间的平均时差? 在这里,棘手的是记录之间的差异。 凸轮你告诉我什么样的信息,你需要更多? – Siv 2009-08-13 11:41:41

0

如果你的意思是每个-其他行之间的差异:

select AVG(x) from (
select a.timestamp - b.timestamp as x 
from table a, table b -- this multiplies a*b) sub 
+0

我只有一个表和多个记录。需要记录时间差异。没有多个表。 – Siv 2009-08-13 11:49:45

+0

当然,但是这将使每个条目与其他条目相关联,例如,你会得到entry1-enty1,entry1-entry2,entry1-entry3等等 - 平均值不会是在“相邻”条目之间...... – 2009-08-13 11:50:37

+0

@Siv - 这个查询只使用一个表 - 但是从中选择两次(使用别名a,b) – Dewfy 2009-08-13 12:18:25

0
SELECT AVG(T2.Timestamp - T1.TimeStamp) 
    FROM Table T1 
    JOIN Table T2 ON T2.ID = T1.ID + 1 
+0

我的假设是(你知道从哪里得到你)是OP对连续记录之间的平均差异感兴趣。 T2.ID不能超出有效ID的范围,因为那里没有记录! – n8wrl 2009-08-13 11:51:13

+1

Id列中的任何空白都会导致中断。 – 2009-08-13 11:51:35

+0

@亚当:哎呀 - 你是对的! – n8wrl 2009-08-13 11:52:49

3

首先想到的是子查询抓取记录马上上一篇:

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 

有可能需要对第一行的结果进行一些处理,但我还没有测试过。

+0

您需要将“前1名”部分调整为与Oracle相同,因为我已经与Oracle合作过了很长时间。 – 2009-08-13 11:59:22

0

试试这个

Select Avg(E.Timestamp - B.Timestamp) 
    From Table B Join Table E 
     On E.Timestamp = 
      (Select Max(Timestamp) 
      From Table 
      Where Timestamp < R.Timestamp)