9

次の表を検討してください。

SELECT id, value FROM table ORDER BY id ASC;
+-----+---------+
| id  | value   |
+-----+---------+
| 12  | 158     |
| 15  | 346     |
| 27  | 334     |
| 84  | 378     |
| 85  | 546     |
+-----+---------+

id列は自動インクリメントされますが、ギャップが含まれています。value列は数値です。

上記の2行に関連してvalue設定することにより、時間の経過に伴う増加を確認したいと思います。これは、行(334)に対して行(546)を設定したい行です。したがって、行に対して計算される値は546/334=1.63473です。valuevalueid=85valueid=85valueid=27id=85

これは私が達成したい結果です:

SELECT id, value, ...;
+-----+---------+---------------------+
| id  | value   | value/lag(value, 2) | (the syntax value/lag(value, 2) is made up)
+-----+---------+---------------------+
| 12  | 158     | NULL                |
| 15  | 346     | NULL                |
| 27  | 334     | 2.11392             | (334/158=2.11392)
| 84  | 378     | 1.09248             | (378/346=1.09248)
| 85  | 546     | 1.63473             | (546/334=1.63473)
+-----+---------+---------------------+

MySQLでこのような遅延を実行するにはどうすればよいですか?

id列にギャップが含まれているため、同じテーブルで単純に結合しても機能しないことに注意してくださいt1.id = t2.id - 2

4

2 に答える 2

9

これがMySQLで必要なものを返すソリューションです

SET @a :=0;
SET @b :=2;
SELECT r.id, r.value, r.value/r2.value AS 'lag'
FROM
(SELECT if(@a, @a:=@a+1, @a:=1) as rownum, id, value FROM results) AS r
LEFT JOIN
(SELECT if(@b, @b:=@b+1, @b:=1) as rownum, id, value FROM results) AS r2
ON r.rownum = r2.rownum

MySQL 5.1は、サブクエリに対する自己結合を好まないため、行を2回カウントする必要があるため、整頓されていたりスケーラブルではありませんが、ラグの指定は簡単です。

代わりにOracleを使用する読者の場合、これははるかに簡単です

SELECT id, value, value/lag(value, 2) over (order by id) as lag from results;
于 2011-03-30T10:40:45.143 に答える
0

現在の行と「履歴」データを取得する行の間に2つの行しかないため、変数を使用して、次のようなものを使用してデータを一時的に保存できます。

set @oldid0=999999;
set @oldid1=999999;
set @oldid2=999999;
select @oldid0:=@oldid1,@oldid1:=@oldid2,@oldid2:=id, value/@oldid0 from table order by id asc;

それは非常に乱雑な解決策ですが、私はそれが仕事をするだろうと思います。変数が表示されないようにする方法があるかもしれませんが、私はこれまで調べていません。

于 2011-03-30T08:05:03.187 に答える