【tableA】
id, date(unixtime), price
1, 1273560668, 500
1, 1272560668, 350
1, 1271560668, 220
1, 1270560668, 710
1, 1269560668, 200
2, .......
3, .......
【得たい結果】
id, date, price, price2
1, 1273560668, 500, 350
1, 1272560668, 350, 220
1, 1271560668, 220, 710
1, 1270560668, 710, 200
1, 1269560668, 200,
のようにidが1のものについて前回のpriceをprice2として呼び出したいのですがどうすべきでしょうか?
http://q.hatena.ne.jp/1268119392 の回答にて応用できそうなのですが、うまくやりきれませんでしたので質問させて頂きます。
・tableAはidとdateで一意となっています。
・売上の無い日もあるため、intervalが使えない。
・できればSQLのみで実現させたい。
(参考)
仕様:MYSQL5.1
日付:UNIXTIMEのINT型
まずはこれ
SET @price = null; SELECT *, @price AS price2, (@price := price) AS pre FROM tableA WHERE id = 1 ORDER BY date
次にこれ
SET @price = null; SELECT id, date, price, price2 FROM ( SELECT *, @price AS price2, (@price := price) AS pre FROM tableA WHERE id = 1 ORDER BY date ) c ORDER BY date DESC ;
SET @id = '', @c = 0; SELECT c.id, c.name , FROM_UNIXTIME(SUM(c.date)) date, SUM(c.price) price, SUM(c.price2) price2 , SUM(c.price2) - SUM(c.price) price3 FROM( SELECT a.* , IF(@id <> a.id, @c := 1, @c := @c + 1) c , IF(@id <> a.id, @id := a.id, @id := @id) i , IF(@c = 1, b.date, 0) date , IF(@c = 1, b.price, 0) price , IF(@c = 2, b.price, 0) price2 FROM tableA a LEFT JOIN tableB b ON b.id = a.id WHERE a.id = 1 <- これを追加しただけ ORDER BY a.id, b.date DESC ) c GROUP BY c.id, c.name ORDER BY price2 DESC;
それも試したのですが、正しい数値が出てこなかったです。
問題文にありますように今回は1つのテーブルからですのでJOINがありません。
以下のようにしたのですが駄目でした。
SET @id = '', @c = 0;
SELECT c.id
, FROM_UNIXTIME(SUM(c.date)) date, SUM(c.price) price, SUM(c.price2) price2
, SUM(c.price2) - SUM(c.price) price3
FROM(
SELECT a.*
, IF(@id <> a.id, @c := 1, @c := @c + 1) c
, IF(@id <> a.id, @id := a.id, @id := @id) i
, IF(@c = 1, a.date, 0) date
, IF(@c = 1, a.price, 0) price
, IF(@c = 2, a.price, 0) price2
FROM tableA a
WHERE a.id = 1
ORDER BY a.id, a.date DESC
) c
GROUP BY c.id, c.date
ORDER BY price2 DESC;
まずはこれ
SET @price = null; SELECT *, @price AS price2, (@price := price) AS pre FROM tableA WHERE id = 1 ORDER BY date
次にこれ
SET @price = null; SELECT id, date, price, price2 FROM ( SELECT *, @price AS price2, (@price := price) AS pre FROM tableA WHERE id = 1 ORDER BY date ) c ORDER BY date DESC ;
2つ目のSQLを実行したところ、
price2の値が [BLOB - 3バイト] のようになりました。
2つ目のSQLを実行したところ、
price2の値が [BLOB - 3バイト] のようになりました。