如何在MySQL中运行求值表达式并相应地更新列?
我有以下表格:如何在MySQL中运行求值表达式并相应地更新列?,mysql,sql,Mysql,Sql,我有以下表格: tweets stocks ------------------------------------- ----------------------------- id stock_id nyse_date class quality stock_id _date return ------------------------------------- ---
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
我需要单独使用SQL计算以下表达式,并在quality
列中填写结果:
IF (class_value of tweet/return on that day) > 0 THEN quality = 1 ELSE 0
类_值为:
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\u值
或实现表达式
UPDATE tweets SET quality = (
SELECT t.class, s.return FROM tweets t
LEFT JOIN stocks s ON t.nyse_date = s._date
)
非常感谢您的帮助:-)
我想测试一下,因为我没有使用MySql,但我最喜欢的Sql Fiddle现在已经关闭。谢谢,SQLFiddle仍然关闭,所以我复制了一份数据库进行测试。我不得不反引用
return
,但随后它运行了。然而,它一直在运行,直到20分钟后超时。如何限制此查询以成批执行操作?我尝试了“[…]>0 LIMIT 0,1000”,但随后出现了一个错误:检查在“1000”附近使用的语法是否正确
@Pr0no我经常创建一个循环并更新,其中id介于@lastID和@lastID-10000之间,然后设置@lastID=@lastID-10000。但是,我不知道如何在MySql中实现。另一方面,如果将其转换为select查询,它的性能是否良好?如果没有,在(股票id,_日期)上建立索引可能会有所帮助。在查询结束时,在x和y之间建立一个简单的。仍然想知道为什么LIMIT
给出了一个错误,但这是除此之外的问题。谢谢:-)这里有一些因果报应。@NikolaMarkovinović对此表示抱歉-SQL Fiddle现在回来了@JakeFeasel没什么可遗憾的。你的网站是我们社区的珍贵礼物。
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