SQL - 返回结果的查询

时间:2009-08-13 11:30:40

标签: sql oracle

有一个表格,如下所示:

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

时间戳以ms为单位给出unix_time。

问题:记录之间的平均时差是多少?

6 个答案:

答案 0 :(得分: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

可能需要对第一行产生的null进行一些处理,但我还没有测试确定。

答案 1 :(得分: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&gt;(SELECT MIN(ID)FROM table)”子句从第二项开始。

马克

答案 2 :(得分:0)

猜测:

SELECT AVG(timestamp)

我认为您需要在问题中提供更多信息,以便我们提供帮助。

答案 3 :(得分:0)

如果你的意思是每一行之间的差异:

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

答案 4 :(得分:0)

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

答案 5 :(得分: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)