2016-04-05 4 views
1

こんにちは、私は現在の日付を照会して前の日付を減算し、SQLを使用して長さの変更(現在の長さ - 前の長さ)を返します。あなたがシミュレートするために、変数を使用することができlength_data日付を差し引いた結果を得る方法

date     length   changes 
------------------- -------------- ------------ 
2000-08-29 10:30:00   147.98 147.98 
2000-08-30 00:00:00   147.98 0 
2000-09-02 10:30:00   156.51 8.53 
2000-09-04 00:00:00   156.51 .... 
2000-09-04 04:30:00   156.51 .... 
2000-09-04 06:30:00   156.51 .... 
2000-09-05 21:00:00   156.51 
2000-09-06 03:00:00   156.51 
2000-09-07 09:30:00   204.06 
2000-09-07 10:30:00   204.06 
2000-09-08 00:00:00   339.09 
2000-09-08 12:30:00   395.78 
2000-09-09 09:30:00   477.77 
2000-09-10 02:30:00   737.77 
+1

非常に簡単です。 RDBMS 'LAG/LEAD'または前の行への自己結合に依存します。 – lad2025

+0

RDBMS(SQL Server、MySQL、Oracle ...)は何ですか? – KenD

+0

@KenD RDBMSはMySQL –

答えて

3

からの長さ、日付を選択 私はそれを行う方法クエリを考えることができませんでし現在マイナス前の長さ

、以下の表のように変化のサンプルを参照してください。 LAGウィンドウ機能:

SELECT `date`, `length`, 
     `length` - @prev AS changes, 
     @prev := `length` 
FROM length_data, (SELECT @prev := 0) AS a 
ORDER BY `date`; 

SqlFiddleDemo

私はdatePRIMARY KEY/UNIQUEであると仮定しましたが、それ以外は安定しません。

EDIT:

あなたはサブクエリを使用することができ、追加の列を削除するには。

SELECT `date`, `length`, `changes` 
FROM (SELECT `date`, `length`, 
     `length` - @prev AS changes, 
     @prev := `length` 
     FROM length_data,(SELECT @prev := 0) as a 
     ORDER BY `date`) AS sub 
ORDER BY `date`; 

SqlFiddleDemo2

出力:

╔══════════════════════════════╦═════════╦═════════╗ 
║   date    ║ length ║ changes ║ 
╠══════════════════════════════╬═════════╬═════════╣ 
║ August, 29 2000 10:30:00  ║ 147.98 ║ 147.98 ║ 
║ August, 30 2000 00:00:00  ║ 147.98 ║ 0  ║ 
║ September, 02 2000 10:30:00 ║ 156.51 ║ 8.53 ║ 
║ September, 04 2000 00:00:00 ║ 156.51 ║ 0  ║ 
║ September, 04 2000 04:30:00 ║ 156.51 ║ 0  ║ 
║ September, 04 2000 06:30:00 ║ 156.51 ║ 0  ║ 
║ September, 05 2000 21:00:00 ║ 156.51 ║ 0  ║ 
║ September, 06 2000 03:00:00 ║ 156.51 ║ 0  ║ 
║ September, 07 2000 09:30:00 ║ 204.06 ║ 47.55 ║ 
║ September, 07 2000 10:30:00 ║ 204.06 ║ 0  ║ 
║ September, 08 2000 00:00:00 ║ 339.09 ║ 135.03 ║ 
║ September, 08 2000 12:30:00 ║ 395.78 ║ 56.69 ║ 
║ September, 09 2000 09:30:00 ║ 477.77 ║ 81.99 ║ 
║ September, 10 2000 02:30:00 ║ 737.77 ║ 260  ║ 
╚══════════════════════════════╩═════════╩═════════╝ 

EDIT 2:1つの列のみを使用して計算するJean Doux's ideaを使用

SELECT `date`, length, 
    CAST((-IF(@prev IS NULL,0,@prev) + (@prev := length)) AS DECIMAL(10,4)) AS changes 
FROM length_data,(SELECT @prev := NULL) AS a 
ORDER BY `date`; 

SqlFiddleDemo2

または最も簡単な方法は、アプリケーション層で追加の列をスキップすることです。

+0

これは完璧なやり方ですが、結果から余分な列@prev:= 'length'を削除するにはどうしたらいいですか? –

+1

それは私の仕事の一つで前進することができます。 –

+0

実際のテーブルにクエリを適用すると、結果が返ってこない場合があります。ローディングを続けると、最適な読み込み速度で動作するようになっていますか? –

1
SELECT 
date, 
length, 
@prevLength - (@prevLength:= length) as changes 
FROM 
test, (SELECT @prevLength:= 0) as a 
ORDER BY account_id ASC, value ASC 
+0

ほぼ正しいです。しかし、現在の形式では '@prevLength - (@prevLength:= length)as changes'は常にゼロになります。 – lad2025

+0

はい、私はサブクエリを使用する必要があります。答えを削除する必要がありますか? –

+0

そして、もし私が日付を選択した場合は、@prevLength - 長さを変更します(@prevLength:= length)...長さは...大丈夫でしょうか?同じ列の順序ではありませんか? –