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型

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2010/05/11 16:08:55
  • 終了:2010/05/12 11:15:16

ベストアンサー

id:Committeeman No.2

Committeeman回答回数153ベストアンサー獲得回数192010/05/11 20:38:26

ポイント130pt

まずはこれ

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
;
id:dekapurio

2つ目のSQLを実行したところ、

price2の値が [BLOB - 3バイト] のようになりました。

2010/05/11 21:42:49

その他の回答(1件)

id:Committeeman No.1

Committeeman回答回数153ベストアンサー獲得回数192010/05/11 17:00:05

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;
id:dekapurio

それも試したのですが、正しい数値が出てこなかったです。

問題文にありますように今回は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;

2010/05/11 19:35:52
id:Committeeman No.2

Committeeman回答回数153ベストアンサー獲得回数192010/05/11 20:38:26ここでベストアンサー

ポイント130pt

まずはこれ

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
;
id:dekapurio

2つ目のSQLを実行したところ、

price2の値が [BLOB - 3バイト] のようになりました。

2010/05/11 21:42:49
  • id:dekapurio
    応用うんぬんと書きましたが、SQLはどのような形でも構いません。
  • id:Committeeman
    Committeeman 2010/05/11 22:37:42
    こちらでは取れているのでどうしてBLOB型とだけ返ってくるのかという原因はまだわからない
    二つある一つ目は正常に吐き出したのかどうかだけでも書いておくと、誰か気づけば回答を書いてくれるものと思う
  • id:dekapurio
    Committeemanさん、回答有難うございます。
    実際には以下のような抽出結果となりまして、priceについてはきちんと取得できています。

    id, date, price, price2
    1 , 1273560668 , 500 , [BLOB - 3バイト]
    1 , 1272560668 , 350 , [BLOB - 3バイト]
    1 , 1271560668 , 220 , [BLOB - 3バイト]
    1 , 1270560668 , 710 , [BLOB - 0バイト]
  • id:dekapurio
    補足:1つ目のSQLもほぼ同様で、preカラムにpriceと同じ値が取得されます。
  • id:dekapurio
    2個目のSQLで、SET @price = 0; とするとうまくいきました。
    どうもお世話をおかけしました。
  • id:dekapurio
    priceに少数があった場合も、price2はすべて整数値になってしまいます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません