人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLについての質問です。

【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型

●質問者: dekapurio
●カテゴリ:ウェブ制作
✍キーワード:SQL 仕様
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Committeeman
●0ポイント
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;


2 ● Committeeman
●130ポイント ベストアンサー

まずはこれ

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バイト] のようになりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ