2012-02-10 17 views
0

この質問はprevious questionと関連しています。私はここのように見えるテーブルの行の間の差分毎日の値を取得したい:累積値を取得するMySQLクエリ

Date   | VALUE 
-------------------------------- 
"2011-01-14 11:00" | 2 
"2011-01-14 19:30" | 5 
"2011-01-15 13:30" | 7 
"2011-01-15 23:50" | 6 
"2011-01-16 9:30" | 10 
"2011-01-16 18:30" | 15 

クエリは、最新の毎日の値は、前の最新の毎日の値との差/累積を取得します。

SELECT 
    t1.dt AS date, 
    t1.value - t2.value AS value 
FROM 
    (SELECT DATE(date) dt, MAX(date), VALUE as value FROM table GROUP BY dt) t1 
JOIN 
    (SELECT DATE(date) dt, MAX(date), VALUE as value FROM table GROUP BY dt) t2 
    ON t1.dt = t2.dt + INTERVAL 1 DAY 

だから、結果は次のようなものです:

Date    | VALUE 
--------------------------- 
"2011-01-15 00:00" | -1 
"2011-01-16 00:00" | 6 

しかし、私はまた、初日からの累積値を必要としています。前日が存在しない場合は、通常、1日分の累積値が必要です。このような何か:

Date    | VALUE 
--------------------------- 
"2011-01-14 00:00" | 3 
"2011-01-15 00:00" | -1 
"2011-01-16 00:00" | 6 

答えて

0

それはとなりません。あなたはほぼ確実に選択した言語で結果セットの繰り返し処理を行う場合、これらの違いを処理したほうが良いだろうが、次のクエリは、

SELECT 
    `t1`.`date`, 
    `t1`.`value`, 
    IFNULL((
     SELECT CAST(`t1`.`value` AS SIGNED) - CAST(`t2`.`value` AS SIGNED) 
     FROM `table` `t2` 
     WHERE `t2`.`date` < `t1`.`date` 
     ORDER BY `date` DESC 
     LIMIT 1 
    ), `t1`.`value`) 
FROM `table` `t1` 
ORDER BY `date` ASC; 
+0

を動作するはずです私は期待して2分以上かかる。私はJava + MySQLの組み合わせで試してみます –

+0

申し訳ありませんが、私は元の投稿を誤解しました。おそらく、サンプル出力の3番目のエントリは5(15 - 10)の値を持つはずです。これをクエリで行うことは可能ですが、Java(あなたのアプリ)でそれを行う方が理にかなっています。サンプルクエリのサブ選択は信頼できません。 GROUP BY句または集約関数のいずれかに、フィールドリストのすべてのフィールドでグループを使用する必要があります。クエリで返される「VALUE」は、グループ化された行のいずれかの値になります。 – nnichols