2009-08-13 25 views
0

を返すために以下のように列を持つテーブルがあります:SQL - クエリ結果

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

タイムスタンプをミリ秒でUNIX_TIMEとして与えられています。

質問:レコードの平均時間差はどのくらいですか?推測で

+0

Oracle 10gデータベースを試してみてください。 – Siv

+0

@Marc、2番目のクエリは正しい結果を返します。 ありがとう。 – Siv

+0

OK、私の答えは元に戻すことができます:-)ありがとう! しかし、Adamのコメントは全く真実であることに注意してください。私の質問は、IDが連続的で、ギャップがない場合にのみ機能します。 –

答えて

1

を、あなたはその情報を取得するためにそのような何かを書くことができ:

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つの表に記載してください。 1を計算し、その間の時間差を計算します。アイテム番号へのアクセスを避けるために0が存在しない場合は、 "T1.ID>(SELECT MIN(ID)FROMテーブル)"句を使用して2番目の項目から開始します。

マルク・

+2

これはIDにギャップがない場合にのみ機能します。 –

+0

@Adam:true - 良い点 –

+0

OK、OPのコメントを参照してください - それは "AUTOINCREMENT"列なので、間違いなく(間違いなく:-)そのようになることはありません) –

0

SELECT AVG(timestamp)

私はあなたが私たちが支援するためにあなたの質問に多くの情報を提供する必要があると思います。

+0

はn個のレコードがあると仮定します。 質問はレコード間の平均時間差に似ていますか?ここでは 、レコード間の微妙な違いがあります。 camあなたはどんな種類の情報をもっと必要としているか教えてください。 – Siv

0

あなたはそれぞれ、他の列の間の差を意味している場合:SQL Serverでの

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

私は1つのテーブルと複数のレコードを持っています。レコード間には時間差が必要です。複数のテーブルではありません。 – Siv

+0

でも、これは各エントリをそれぞれの他のエントリに関連付けることになります。あなたはentry1 - enty1、entry1 - entry2、entry1 - entry3などを取得します - 平均は、互いに "隣人"であるエントリの間ではありません...... –

+0

@Siv - このクエリでは1つのテーブルが使用されますが、2回選択します(エイリアスa、bを使用) – Dewfy

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

+1

Id列のギャップがあれば、ブレークが発生します。 –

+0

@Adam:おっと - そうですよ! – n8wrl

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のいくつかの処理がありますが、私は確かにテストしていません。

+0

「トップ1」の部分をOracle同等物に合わせる必要があります。私はOracleと作業して以来、長すぎます。 –

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)