2010-11-29 61 views
2

我有一个表(其中包括)时间戳列(名为timestamp;它是一个标准的Oracle DATE数据类型)。记录大约需要4-11分钟,每小时记录大约7或8条记录,并且我试图确定是否有任何模式。记录之间的时间差

是否有一种简单的方法可以查看每条记录,以及记录在上一条记录之后发生的分钟数?

感谢, AndyDan

回答

8

这是Oracle 9i中+,使用LAG function获得先前时间戳值,而无需自连接:

SELECT t.timestamp - LAG(t.timestamp) OVER (ORDER BY t.timestamp) AS diff 
    FROM YOUR_TABLE t 

...但因为整个数字代表结果的天数,一个差少于24小时将是一小部分。而且,如果没有较早的值,LAG将返回NULL - 与使用OUTER JOIN相同。

要查看分钟,使用ROUND函数:

SELECT ROUND((t.timestamp - LAG(t.timestamp) OVER (ORDER BY t.timestamp)) *1440) AS diff_in_minutes 
    FROM YOUR_TABLE t 
1

如果这些记录有连续的id,你可以做一个自我加入这样的:

SELECT t2.*, t2.timestamp - t1.timestamp AS timediff 
FROM foo t1 inner join foo.t2 on t1.id = t2.id-1 

你可能需要调整这个处理第一个和最后一个记录,但这是基础知识。

+0

不幸的是,没有ID,顺序或其他。排序记录的唯一可靠方法是按时间戳。谢谢,不过。 – AndyDan 2010-11-29 22:22:59

+0

即使存在,也不能保证它们始终是顺序的 - 时间戳值可能会后退,但id值是最新的。 – 2010-11-29 22:29:32