2010-11-29 33 views
2

タイムスタンプ列(タイムスタンプという名前の標準のOracle DATEデータ型)を持つ表があります。レコードは約4-11分離れており、毎時間約7〜8件のレコードがあり、それらにパターンがあるかどうかを判断しようとしています。レコード間の時間の差

各レコードとその前のレコードの後に​​記録された分数を簡単に確認する方法はありますか?

おかげで、 AndyDan

答えて

8

これは、自己に必要とせずに、前のタイムスタンプ値を取得するためにLAG functionを使用して、Oracle 9iの+は、参加している:

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

...しかし、全体の数字は、結果での違いを日数を表すため、 24時間未満の場合は分数になります。また、LAGは、以前の値がない場合はNULLを返します。これは、OUTER JOINを使用した場合と同じです。

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

完璧! SELECT句を "SELECT t。*、(t.timestamp - LAG(t.timestamp)OVER(ORDER BY t.timestamp))* 1440 ASの差異"に変更してレコードに差分を加えた数を加え、それは私に必要なものを正確に教えてくれます。ありがとう!!! – AndyDan

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は、ありません:、分を参照ROUND関数を使用し

。レコードをソートする唯一の信頼できる方法は、タイムスタンプによるものです。しかし、ありがとう。 – AndyDan

+0

たとえあったとしても、それらが常にシーケンシャルであるという保証はありません - タイムスタンプ値はバックデートすることができますが、id値は最新です。 –