2012-01-18 26 views
2

データベースの異なる行の平均時間差を返すクエリを作成しようとしています。基本的には、これは図に基づいてレコードを格納するテーブルと関係がある。決定列はRSP_TRM_IRNであり、タイムスタンプは、RSP_TRM_IRNの異なる値に対する各サブシーケンシャルエントリに格納されます。下の表は、データがどのように構造化されているかを示しています。 RSP_TRM_IRNの一意の値に基づいてテーブルの各エントリの平均時間差を返すようにします。スキーマも下にあります。データベース内の行間のDateTimeの差

スキーマ:

"RSP_IRN" type="bigint" width="8" 
"RSP_DATETIME" type="timestamp" width="8" 
"RSP_TRM_IRN" type="bigint" width="8" 

サンプルデータ、それが配布される方法を実証する:

RSP_TRM_IRN  RSP_DATETIME 
93  2011-11-09 13:18:32 
101 2011-11-03 11:49:10 
7  2011-11-08 02:32:28 
101 2011-11-14 16:48:43 
108 2011-11-17 09:00:49 
5  2011-10-12 09:30:28 
213 2011-11-17 13:47:23 
108 2011-11-17 07:18:15 
7  2011-11-07 06:43:49 
159 2011-11-21 06:49:25 
5  2011-11-16 07:10:58 
104 2011-11-03 15:17:39 
108 2011-11-15 23:34:58 
5  2011-11-22 09:38:02 
108 2011-11-13 13:28:32 
7  2011-10-26 00:07:26 
100 2011-11-14 14:27:02 
5  2011-11-14 21:56:05 
7  2011-10-25 12:11:17 
145 2011-11-21 15:26:17 
5  2011-10-10 11:23:53 

誰を助けてください。これをPHPで試してみましたが、ロジックをもっと複雑にするループがたくさんあるはずです。上記のデータを使用して達成しようとしているのは、RSP_TRM_IRN = 5などの時間の平均時間差を求めることです。

+0

を使うのでしょうか? – Yuck

+0

@ Stun101:サンプルデータがテーブル構造と一致していないようです。 –

+0

@MarkBannisterそれは私のように見えます...列は同じ順序でリストされておらず、 'RSP_IRN'は含まれていませんが、そうでない場合は一致します。 – Yuck

答えて

2

すべての期間が連続しているので、あなたが知る必要があるのはtime of the first eventtime of the last eventおよびnumber of discrete periodsです。

平均は(仕上げ開始)/ピリオドです。使用しているsqlの方言に応じて、(finish-start)は、さまざまな形式を取ることができます(SQL ServerではDATEDIFF()など)。

ここでは、必要な情報をどのように得るかについて説明します。

SELECT 
    RSP_TRM_IRN, 
    COUNT(*) - 1   AS periods, 
    MIN(RSP_DATETIME) AS start, 
    MAX(RSP_DATETIME) AS finish 
FROM 
    yourTable 
GROUP BY 
    RSP_TRM_IRN 

SQL Serverは、これはMySQLのであると仮定すると...

DATEDIFF(SECOND, MIN(RSP_DATETIME), MAX(RSP_DATETIME))/(COUNT(*) - 1) AS Average_Period_Length 
関連する問題