2014-03-01 32 views
0

我对sql很陌生,我很难弄清楚如何编写我的查询来更新我的一个表。我有一个表stock_price与下列字段:对于表中的每条记录,使用最小和最大值更新列

stock_symbol, date, open_price, daily_high, daily_low, close_price,volume

该表中填充了每年美国股票的2年(2012年,2013年)每日股价,相当于约190万条记录。

我期待添加两个新字段year_highyear_low。对于2013年的记录,我需要使用现有数据(过去365天的close_price的最小值和最大值)计算并更新这些新字段。我真的在迷失如何解决这个问题,所以我希望有人能帮助我开始。

回答

0

解决这个使用通用SQL做计算的一种方式:

select p.*, 
     (select min(sp2.close_price) 
     from stock_price sp2 
     where sp2.stock_symbol = sp.stock_symbol and 
       sp2.date between sp.date - 365 and sp.date 
     ) as yearmin, 
     (select max(sp2.close_price) 
     from stock_price sp2 
     where sp2.stock_symbol = sp.stock_symbol and 
       sp2.date between sp.date - 365 and sp.date 
     ) as yearmax 
from stock_price sp; 

数据库不同的日期计算了一下,所以减法可能是不够的。

如果你在你的表中的列(或者,如果你添加它们使用alter table),你可以更新他们为:

update stock_price 
    set year_min = (select min(sp2.close_price) 
        from stock_price sp2 
        where sp2.stock_symbol = stock_price.stock_symbol and 
          sp2.date between stock_price.date - 365 and stock_price.date 
        ), 
     year_max = (select max(sp2.close_price) 
        from stock_price sp2 
        where sp2.stock_symbol = stock_price.stock_symbol and 
          sp2.date between stock_price.date - 365 and stock_price.date 
        ); 

注意,这两个将投入价值为先364天,即使全年不可用。

+0

真棒!这很好用!正是我在找的东西。感谢帮助!! – user3368353

0

更新stock_price set year_high =(选择max(close_price),其中日期介于'start_date'和'end_date'之间),其中日期介于'start_date'和'end_date'之间;设置year_low =(选择min(close_price)'start_date'和'end_date'之间的日期),其中'start_date'和'end_date'之间的日期;以及其他日期。

还有就是要在做它在表上的冗余数据这种方式,另一种方法是将有一个单独的表一年明智的最小值和最大值

相关问题