我如何查询平均值的总和?

时间:2014-04-03 04:00:53

标签: mysql

我的数据类似于每小时更新的股票数据。因此每个股票每天有24个条目。 (仅以股票为例)。但有时,数据可能无法更新。

例如,假设我们有3只股票,A,B,C。并假设我们在白天以不同的时间间隔收集每只股票的数据。数据看起来像这样......

row   A    B    C
 1    3    4    5
 2    3.5  4.1  5
 3    2.9  3.8  4.3

我想要的是总结这段时间内每只股票的平均价值     平均(A)+平均(B)+平均(C)

实际上,我有数百种股票和数十万行。我需要这个计算一天。

我试过这个(股票名称在数组中 - stocks = array(' A',' B'' C'))

SELECT SUM(AVG(stock_price)) FROM table WHERE date = [mydate] AND stock_name IN () ('".implode("','", $stocks)."') GROUP BY stock_name

但那并没有奏效。有人可以提供一些见解吗?

先谢谢。

2 个答案:

答案 0 :(得分:2)

计算子查询中的每个股票平均值,然后在主查询中对它们求和。

SELECT SUM(average_price) AS total_averages
FROM (SELECT AVG(price) AS average_price)
      FROM table
      WHERE <conditions>
      GROUP BY stock_name) AS averages

答案 1 :(得分:1)

一种方法,使用内联视图作为行源:

SELECT SUM(a.avg_stock_price) AS sum_avg_stock_price
  FROM ( SELECT AVG(t.stock_price) AS avg_stock_price
           FROM table t
          WHERE t.date = [mydate]
            AND t.stock_name IN ('a','b','c')
          GROUP BY t.stock_name
       ) a

您可以仅从内联视图运行查询(别名为a)以验证它返回的结果。外部查询针对内联视图查询返回的行集运行。 (MySQL将内联视图(别名为a)称为&#34;派生表&#34;。

外部查询实际上是这样的:

SELECT SUM(a.avg_stock_price) AS sum_avg_stock_price
  FROM a

&#34;技巧&#34;是"a"不是常规表,它是查询返回的一组行;但就关系代数理论而言,它的作用相同......它是一组或多行。如果a是常规表,我们可以写:

SELECT b.col
  FROM (
         SELECT col FROM a
       ) b

由于MySQL处理这种方式的效率低下,我们不想在MySQL中执行此操作。 MySQL首先运行内部查询(内联视图中的查询)。 MySQL创建一个临时MyISAM表,并将查询返回的行插入临时MyISAM表。 MySQL然后针对该临时表(MySQL称为&#34;派生表&#34;)运行外部查询以返回结果。创建和填充一个临时表是一个常规表的副本是一个很大的开销,特别是对于大型集合。

使这个功能强大的是内联视图查询可以包括JOIN,WHERE子句,聚合,GROUP BY等等。只要它返回一组行(具有适当的列名),我们就可以将查询包装在parens中,并在另一个查询中引用它,就像它是一个表一样。