我的数据类似于每小时更新的股票数据。因此每个股票每天有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
但那并没有奏效。有人可以提供一些见解吗?
先谢谢。
答案 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中,并在另一个查询中引用它,就像它是一个表一样。