2013-08-08 6 views
5

質問の件名はそれほど説明できません。申し訳ありません。 pkがプライマリキーであるid: のデータ構造は、以下のように多くの行に対して複数のものがあります。本当に取得する必要がありますされて何IDに基づいて2つの行の間のtimediffを見つけるSQL

+------+------+---------------------+ 
| pk | id | value    | 
+------+------+---------------------+ 
| 99 | 1 | 2013-08-06 11:10:00 | 
| 100 | 1 | 2013-08-06 11:15:00 | 
| 101 | 1 | 2013-08-06 11:20:00 | 
| 102 | 1 | 2013-08-06 11:25:00 | 
| 103 | 2 | 2013-08-06 15:10:00 | 
| 104 | 2 | 2013-08-06 15:15:00 | 
| 105 | 2 | 2013-08-06 15:20:00 | 
+------+------+---------------------+ 

は、(グループのIDである)各 グループの(値によって順序付けされた)最初の2行の間の値の差です。したがって、上記の構成によれば、私は[ID 2グループのためのものである] timediff(value100、value99)[ID 1グループのためのものである] とtimediff(value104、value103)

すなわち値によって順序付けられた時間の値の差を必要とします各グループの最初の2行分。

私が考えることができる1つの方法は、3つの自己結合(または3つのサブクエリ)によって、 最初の2つを見つけ、それを減算する3番目のクエリです。助言がありますか?

+0

あなたは単一のSQL命令でそれを必要としますか?ストアドプロシージャを使用できますか(または使用しますか?) – Barranka

+0

単一のSQLソリューションを愛するでしょう – amitchhajer

+0

ちょうど私の例を更新しました。あなたの問題の解決策として答えをマークしてください。 – lordkain

答えて

0

ビット奇妙に見える...しかし、あなたが必要とされないことが..しかし、ちょうど何も

SELECT pkid, id, diff, valtemp FROM (
SELECT IF(@previousID = id, @temp := @temp + 1, @temp := 1) occ, @previousID := id, 
TIMEDIFF(`value`, @previous) diff, pk, id, `value`, @previous := `value` 
FROM testtable) a WHERE occ = 2 

うまくいかないことを確認するためにステップの上に

SET @previous = 0; 
SET @temp = 0; 
SET @tempID = 0; 

この方法を試すことができます

Demo on sql fiddle

1

これを試してください.. CTEはかなり強力です!

WITH CTE AS (
    SELECT 
    value, pk, id, 
    rnk = ROW_NUMBER() OVER (PARTITION BY id order by id DESC) 
    , rownum = ROW_NUMBER() OVER (ORDER BY id, pk) 
    FROM test 
) 
SELECT 
    curr.rnk, prev.rnk, curr.rownum, prev.rownum, curr.pk, prev.pk, curr.id, prev.id, curr.value, prev.value, curr.value - prev.value 
FROM CTE curr 
INNER JOIN CTE prev on curr.rownum = prev.rownum -1 and curr.id = prev.id 
and curr.rnk <=1 
+0

idも加わる例 – lordkain

+0

タグから、使用されるDBがMySqlであり、 MSSQL。 CTEはMSSQLでサポートされています。 – Akhil

+0

はいmysql、いいえcte。間違いなく、他の人には助けになるでしょう。 – amitchhajer

関連する問題