对于表中的每条记录,使用min和max更新列

时间:2014-03-01 14:55:40

标签: sql

我对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的最小值和最大值)来计算和更新这些新字段。我真的迷失了如何解决这个问题,所以我希望有人可以帮助我开始。

2 个答案:

答案 0 :(得分: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天的值。

答案 1 :(得分:0)

更新stock_price设置year_high =(选择max(close_price),其中'start_date'和'end_date'之间的日期)'start_date'和'end_date'之间的日期;

更新stock_price设置year_low =(选择min(close_price),其中'start_date'和'end_date'之间的日期)'start_date'和'end_date'之间的日期;

表中会有冗余数据以这种方式执行,另一种方法是使用单独的表来显示年度最小值和最大值