2011-03-03 10 views
4

データベーステーブルから取得したいものに問題があります。隣接するレコード間の差を取得するSQLクエリ

表には、私は、アクションの各タイプの平均時間間隔(本の次のアクションマイナスSTARTTIMEのSTARTTIME)を取得したいこの

startTime endTime type 
1:00  1:02 A  
1:20  1:30 A 
3:45  3:50 A 
1:30  1:40 B 
2:30  2:31 A 
3:00  3:01 A 
... 

のように見えます。

どうすればいいですか?

編集:

ルールがあります。インターバルが1時間より大きい場合は、平均よりも1時間以上大きい場合。そのため、時間間隔全体を間隔数で割った値と等しくはありません。午前1時00分= 20分(このレコードを取る) 2時30分 - - 1時20分= 70分(これを破棄だから、計算が 1:20でなければなりません(単にAのため)、

startTime endTime type 
1:00  1:02 A  
1:20  1:30 A 
2:30  2:31 A 
3:00  3:01 A 
3:45  3:50 A 

なりレコード) 3:00 - 2:30 = 30分(これを取る) 3:45 - 3:00 = 45分(これを取る)

最終結果は(20 + 30 + 45)/ 3

+0

*次の* *または* – bluish

+0

私は次の時間を意味します – Johnyy

+1

http://stackoverflow.com/questions/4312019/mysql-average-interval-between-records – Unreason

答えて

3

データを少し再フォーマットしてエスケープすることはなく、そのために一時テーブルを使用することができます。

メモ:すべての時間形式の計算を避けるために、ソースデータとして時間ではなく整数でテーブルを作成しましたが、実際は同じです。

私が作成したソース・データは次のとおりです。

DROP TABLE IF EXISTS temp; 
CREATE TABLE temp (
id int(100) AUTO_INCREMENT, 
start int(11) NOT NULL, 
type VARCHAR(6), 
PRIMARY KEY id (id)); 

INSERT INTO temp(start, type) 
SELECT start, type FROM table 
ORDER BY type, start; 

SELECT t1.type, AVG(t1.start - t2.start) AS avg_gap 
FROM temp t1 
JOIN temp t2 ON t1.type = t2.type AND t1.id = (t2.id + 1) 
WHERE t1.start - t2.start < 5 
GROUP BY t1.type; 

、結果は次のとおりです:

CREATE TABLE `table` (
`start` INT(11) NOT NULL, 
`end` INT(11) NOT NULL, 
`type` VARCHAR(6)); 

INSERT INTO `table` VALUES 
(1,3,'A'), 
(5,7,'A'), 
(6,10,'A'), 
(2,6,'B'), 
(3,4,'B'), 
(5,11,'B'), 
(12,13,'B'); 

その後、あなたの答えを得るために使用する必要があるスクリプトがある

type avg_gap 
A  2.5 
B  1.5 

編集:編集の新しいルールに従う:私のルールは計算しないギャップが5より大きい場合(最終クエリのWHERE節に表示されているように)したがって、タイプBの最後のギャップは無視されました。

+0

ああ、素敵な努力だけど、一時テーブルはおそらく必要ない... – Unreason

0

問題はそれから他の有効な解決策は、例えば、あなたには適用されないMySQL: Average interval between recordsに1と同じでなくても、OK:

SELECT type, AVG(minutes) 
FROM 
(SELECT type, EXTRACT(MINUTE FROM TIMEDIFF(t2.startTime, MAX(t1.startTime))) minutes 
FROM table t1 JOIN 
    table t2 ON t1.type = t2.type AND 
       t1.startTime > SUBTIME(t2.startTime, '01:00:00') AND 
       t1.startTime < t2.startTime 
GROUP BY type, t2.startTime 
) x 
GROUP BY type 

いくつかの仮定が上記のクエリにあります。

  • のstartTimeタイプは、それがタイプごとに一意であるTIME
  • ある(ない2つのイベントが同時に開始しない)
  • それが実際excludiです1時間のちょうど1時間の間隔もあります。
関連する問題