0

私は次のテーブルを持っています:

tweets                                     stocks
-------------------------------------      -----------------------------
id stock_id nyse_date   class quality      stock_id _date         return
-------------------------------------      -----------------------------
1  1        2011-03-12  3                  1        2011-03-12    0.44
2  1        2011-03-12  1                  1        2011-03-15    0.17
3  1        2011-03-15  2                  2        2011-03-15   -0.03
4  2        2011-03-15  2
5  2        2011-03-16  1

次の式を評価し、qualitySQLのみを使用して列に結果を入力する必要があります。

IF (class_value of tweet/return on that day) > 0 THEN quality = 1 ELSE 0

class_valueは次のとおりです。

IF class = 1 THEN class_value =  0
IF class = 2 THEN class_value =  1
IF class = 3 THEN class_value = -1

ツイートごとに、(明らかに)その日の株式の返品を受け取る必要があります。週末の間、たとえば、の2011-03-16場合、利用可能な在庫データはありません。その場合、qualityデフォルトでも0に設定する必要があります(エラーを返さないでください)。それでは、例の4つのツイートに対してこれを手動で実行しましょう。

id  class  class_value  return  class_value/return  quality
-----------------------------------------------------------
1   3      -1            0.44   -1/0.44  =  -2.27   0
2   1       0            0.44    0/0.44  =   0      0
3   2       1            0.17    1/0.17  =   5.88   1
4   2       1           -0.03    1/-0.03 = -33.33   0
5   1       0            n/a                        0

したがって、クエリの最終結果は更新されたtweetsテーブルになります。

tweets                               
-------------------------------------
id stock_id nyse_date   class quality
-------------------------------------
1  1        2011-03-12  3     0
2  1        2011-03-12  1     0
3  1        2011-03-15  2     1
4  2        2011-03-15  2     0
5  2        2011-03-16  1     0

これらすべてをクエリに入れる方法がわかりません。これができましたが、クラスを選択して返すだけでclass_value、式を設定または実装しません。

UPDATE tweets SET quality = (
  SELECT t.class, s.return FROM tweets t 
  LEFT JOIN stocks s ON t.nyse_date = s._date
)

どんな助けでも大歓迎です:-)

4

1 に答える 1

2
update tweets
   set quality = ifnull(case tweets.class
                             when 1 then 0
                             when 2 then 1
                             when 3 then -1
                        end
                 -- If there is no match, subquery will evaluate to null
                 -- Division will also evaluate to null
                      / (select `return`
                           from stocks
                          where tweets.nyse_date = stocks._date
                            and tweets.stock_id = stocks.stock_id
                        )
                 -- If there was no match, quality = 0
                      , 0)
                 -- Shortcut to set 1 if condition is satisfied
                 -- If there is an error try encapsulating
                 -- whole expression into case when (ex) then 1 else 0 end
                      > 0

MySqlを使用していないため、これをテストしたかったのですが、現在、お気に入りのSqlFiddleがダウンしています。

于 2012-07-18T12:28:48.887 に答える