2011-11-20 6 views
-1

1つの会社の株式の取引に関する情報を含むテーブルstockpriceがあります。タイムスタンプと価格の2つの列があります。彼らは貿易が起こった時と売却の価格を表します。テーブル内のレコードの自然順序はランダムであり、タイムスタンプでソートされません。現在の行とSQLの時間順テーブルの次の行とのペアを作成しようとすると、不明な列エラー

現在の取引価格と以前の取引の価格との差額を時間的に保存する別の列(デルタと呼ぶ)を追加します。

価格差を計算し、すべての行でその差異デルタを入力する単一のSQL文を作成します。

私はmysql上で実行するために以下のようにsqlを書いていますが、私は動かすことができません。現在の取引価格と以前のトランザクションの価格との差を計算するために、最初の行の前のは何もありませんので、賢明な、mysqlの私にエラー「『フィールドリスト』不明な列 『previous.price』」を与える、いくつかの専門家は、これは

SELECT 
    `current`.timestamp, 
    `current`.price, 
    `current`.price - IFNULL(`previous`.price, 0) AS delta 
    FROM 
    stockprice  AS `current` 
LEFT JOIN 
    stockprice  AS `next` 
     ON `next`.timestamp = (SELECT MIN(timestamp) 
           FROM stockprice 
           WHERE timestamp > `current`.timestamp) 
My database like: 
timestamp     price 
2011-10-27 00:00:00  12424 
2011-10-24 00:00:00  15464 
2011-10-25 00:00:00  543464 
2011-10-23 00:00:00  58791 
+0

宿題を追加してください –

+0

タイムスタンプ列にユニーク制約(主キー制約)がありますか? –

+3

質問に関する有用な情報を提供する質問タイトルを記入してください。あなたはそれをタグ付けしたので、それはSQLに関するものです。あなたは質問を投稿したので、それは質問です。現在のタイトル_「難しいSQLはもう一度、専門家が必要ですか?」_は何も追加しません。 –

答えて

1

あなたかどうかを決定し?:解決するためのアイデアを持っていることができます次のタイムスタンプまたは前のタイムスタンプを扱っています:

SELECT `current`.timestamp, 
     `current`.price, 
     `current`.price - IFNULL(`previous`.price, 0) AS delta 
    FROM stockprice  AS `current` 
    LEFT JOIN stockprice AS `previous` 
    ON `previous`.timestamp = (SELECT MAX(timestamp) 
           FROM stockprice 
           WHERE timestamp < `current`.timestamp) 

バッククォートの使用を避けるか:

SELECT C.timestamp, 
     C.price, 
     C.price - IFNULL(P.price, 0) AS delta 
    FROM stockprice  AS C 
    LEFT JOIN stockprice AS P 
    ON P.timestamp = (SELECT MAX(S.timestamp) 
         FROM stockprice AS S 
         WHERE S.timestamp < C.timestamp) 
+0

エラーが解決しましたが、結果の戻りが正しくないようです。 – user1055108

+0

バージョンを '>'または '<'で試しましたか?私は初めてミスタイプして編集しました。 –

+0

ありがとう、perfecrt、あなたは天才です! – user1055108

0

「不明な列 『previous.price』 『フィールドリスト』に」私はそのエラーの原因となるこのクエリでは何も表示されません。 。実行しているクエリ全体が本当ですか?これは最初のレコードが参加する前のレコードではないこととは関係ありません。これは、priceという列を持つpreviousというテーブル(またはエイリアス)がないことを意味します。

+0

エラーが解決しましたが、戻り値が正しくない場合は、Jonathan Lefflerのソリューションを確認してください。 – user1055108

関連する問題