2013-07-18 39 views
0

我有一个存储股市数据的数据库。期间获取平均数

有3列一个表:stockId日期

新的数据将被插入到表中每个交易日。

我如何得到'过去10个交易日内每只股票的平均交易量'等结果?

+2

通过编写查询:) – Krishna

+0

或抓取结果之间的时间段,并使用任何编程语言,你正在使用总和除以数量。 – celwell

+0

我想知道可以用单个查询来完成吗? –

回答

1
SELECT SUM(volume)/10 FROM table_name 
Where date Between Cast('7/18/13 12:01:01' As DateTime) And Cast('7/08/13 12:01:01' as DateTime) 
+0

对不起......我的意思是股票的平均交易量, 的股票,而不是整个股票市场的平均交易量。 –

+0

你有一个错误的语法,请删除第一行 –

+0

末尾的分号,分号很明显。大声笑 –

1
SELECT AVG(volume) FROM mytable WHERE date >= (CURDATE() - INTERVAL 10 DAY) 

编辑:

最近10天剂量组,他们的平均水平。

SELECT AVG(volume) FROM mytable GROUP BY date ORDER BY date DESC LIMIT 10 
+0

将返回过去10天,而不是最后10个交易日。我是否必须创建一张表来记录交易日? –

+0

可能“按日期分组”可以帮忙吗? –

+0

我已编辑答案。如果你想获得stockId值,我认为可以使用GROUP_CONCAT。 –

1

http://sqlfiddle.com/#!6/c8dbb/4

CREATE TABLE Stocks 
    ([StockId] int, [Date] DateTime, [Volume] int) 
; 

INSERT INTO Stocks 
    ([StockId], [Date], [Volume]) 
VALUES 
    (1, GetDate(), 1000), 
    (1, GetDate()+1, 2000), 
    (1, GetDate()+2, 4000), 
    (2, GetDate(), 1000), 
    (2, GetDate()+1, 1000), 
    (2, GetDate()+2, 500) 
; 

Select StockId, AVG(Volume) [AverageVolume] 
FROM Stocks 
WHERE [Date] >= DATEADD(dd, 0, DATEDIFF(dd, 0, GetDate())) - 10 
Group by StockId 
Order by StockId 
+1

哇。 sqlfiddle.com真的很酷。 –

+0

GetDate()可能需要根据您的要求进行更改,以仅返回日期部分和午夜时间部分。我将在一分钟内更改代码以反映这一点。 – Dodecapus

+0

它正在返回日子,而不是交易日。 –

0

有趣的小查询写。那就是:

SELECT AVG(x.Volume) FROM (SELECT Volume FROM StockTable WHERE Date BETWEEN 
DATE_ADD(NOW(), INTERVAL -10 DAY) AND NOW())x 

这是我用来建立一个样品表SQLFiddle关闭的工作:

CREATE TABLE StockTable (ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL, Date DATETIME, Volume INT); 
INSERT INTO StockTable (Date, Volume) VALUES (DATE_ADD(NOW(), INTERVAL 12 DAY), 1000), (DATE_ADD(NOW(), INTERVAL 1 DAY), 5000), 
(DATE_ADD(NOW(), INTERVAL 0 DAY), 3000), (DATE_ADD(NOW(), INTERVAL -11 DAY), 6000), (DATE_ADD(NOW(), INTERVAL -5 DAY), 4000), (DATE_ADD(NOW(), INTERVAL 7 DAY), 9000); 

这里是行动的查询SQLFiddle的链接。查询背后

理念:我创建一个派生表x其中只包含内近10天的卷。然后我计算该表格中包含的卷的平均值。瞧!

编辑:

我特别意识到你是通过其他的答案和评论看完后找什么。您正在寻找在过去10天内股票市场中每只股票的平均

我建的样品台客这样的:

CREATE TABLE StockTable (StockId INT NOT NULL, Date DATETIME, Volume INT); 
INSERT INTO StockTable (StockId, Date, Volume) VALUES (1, DATE_ADD(NOW(), INTERVAL 6 
DAY), 1000), (2, DATE_ADD(NOW(), INTERVAL 1 DAY), 5000), 
(2, DATE_ADD(NOW(), INTERVAL 0 DAY), 3000), (3, DATE_ADD(NOW(), INTERVAL -8 DAY), 
6000), (1, DATE_ADD(NOW(), INTERVAL -5 DAY), 4000), 
(2, DATE_ADD(NOW(), INTERVAL 7 DAY), 9000); 

和查询,让您的结果是:

SELECT StockId, AVG(Volume) FROM StockTable WHERE Date BETWEEN DATE_ADD(NOW(), 
INTERVAL -10 DAY) AND NOW() GROUP BY StockId 

Here是在行动查询SQLFiddle的链接。

1

我基于这个Dodecapus的答案,并基于您给其他答案的评论。我只是在回答中包含查询,但请查看sqlfiddle以获取有关数据的工作示例。

http://sqlfiddle.com/#!6/91599/2

SELECT 
    StockId 
    ,AVG(Volume) [AverageVolume] 
FROM Stocks 
WHERE [Date] IN 
(
    SELECT DISTINCT TOP 10 [Date] FROM Stocks ORDER BY [Date] DESC 
) 
GROUP BY StockId 
ORDER BY StockId 

此,如果有至少一个股票,每交易日成交量纪录只会工作。

+0

优秀的解释,你看起来很帅! –

+0

谢谢!如果我的答案和英俊的外表是解决您的问题,请随时通过接受它来表示您的赞赏:) –