我存储了股票数据@ frame 1分钟,所以1行=1分钟,我使用这个查询来获取每天的min、max、sum、first和first记录。
我每天有511 1分钟的排(从0900到1730)。
SELECT MAX(high), MIN(low), SUM(volume) from a2a where date = 20131202;
SELECT open FROM a2a ORDER BY time LIMIT 1;
SELECT close FROM a2a WHERE time = 1730 ORDER BY time DESC LIMIT 1;
SELECT MAX(high), MIN(low), SUM(volume) from a2a where date = 20131203;
SELECT open FROM a2a ORDER BY time LIMIT 1;
SELECT close FROM a2a WHERE time = 1730 ORDER BY time DESC LIMIT 1;
SELECT MAX(high), MIN(low), SUM(volume) from a2a where date = 20131204;
SELECT open FROM a2a ORDER BY time LIMIT 1;
SELECT close FROM a2a WHERE time = 1730 ORDER BY time DESC LIMIT 1;在Netbeans中,它返回9个选项卡:
我的问题是:
( 1)是否有办法在一个标签中获得这些结果?
2)我是否需要每天执行3次不同的选择,还是有办法在一个查询中完成这一任务?
3)是否有比这更快的方法来计算这些总和?发布的只是一个例子,我需要得到数以百计的每日数据。
编辑:表a2a图像。日期和时间类型为CHAR,ope关闭为双倍,卷为整数。

发布于 2014-01-08 14:26:14
您可以使用相关子查询获得打开和关闭:
SELECT symbol, date, MAX(high) AS high, MIN(low) as low, SUM(volume) as volume,
(select open from a2a a2 where a1.symbol = a2.symbol and a1.date = a2.date order by time limit 1) as open,
(select close from a2a a2 where a1.symbol = a2.symbol and a1.date = a2.date order by time desc limit 1) as close
FROM a2a a1
GROUP BY symbol, date
ORDER BY symbol, date;a2a(symbol, date, time)上的索引将加快此查询的速度。
发布于 2014-01-08 14:19:03
在高/低/量的情况下试试这个
SELECT symbol,
date,
MAX(high) AS dailyhigh,
MIN(low) AS dailylow,
SUM(volume) AS dailyvolume
GROUP BY symbol, date每个符号每天可以得到一排。
很难说你如何处理开盘价。当然,即使没有日期,整个表中的第一个时间戳也不是正确的方法。那么,让我们计算出每个日期的最早时间戳。
SELECT symbol,
date,
MIN(time) AS opentime
FROM a2a
GROUP BY symbol, date现在,我们需要查一下那个时间戳的开盘价。怎么做?它变得更复杂了,因为对于这个特定的时间和日期,您可能有多个行。
SELECT a.symbol,
a.date,
AVG (a.open) AS dailyopen
FROM a2a a
JOIN (
SELECT symbol,
date,
MIN(time) AS opentime
FROM a2a
GROUP BY symbol, date
) AS b ON a.symbol = b.symbol
AND a.date = b.date
AND a.time = b.opentime
GROUP BY a.symbol, a.date这将提取每个符号和日期的开始记录(最低时间记录)。
现在,在我看来,你的收尾记录是具有时间戳1730的记录,或者是时间戳小于1730的最新记录。这将从快速SQL变成真正的工作,但这些都是财务记录,麦道夫被关在监狱里,所以让我们把它做好。这是每个日期的每个符号的结束时间。
SELECT symbol,
date,
MAX(time) AS closetime
FROM a2a
WHERE time <= 1730
GROUP BY symbol, date现在我们需要每个日期的每个符号的收盘价。我们将以同样的方式收回开盘价。
SELECT a.symbol,
a.date,
AVG (a.close) AS dailyclose
FROM a2a a
JOIN (
SELECT symbol,
date,
MAX(time) AS closetime
FROM a2a
WHERE time <= 1730
GROUP BY symbol, date
) AS b ON a.symbol = b.symbol
AND a.date = b.date
AND a.time = b.closetime
GROUP BY a.symbol, a.date下一步是将这三个摘要查询连接在一起,并限制您正在处理的日期范围。
SELECT d.symbol, d.date, d.dailyhigh, d.dailylow, d.dailyvolume,
o.dailyopen,
c.dailyclose
FROM (
/* the first summary query, daily high low volume */
) AS d
JOIN (
/* the second summary query, daily open */
) AS o ON d.symbol = o.symbol AND d.date = o.date
JOIN (
/* the third summary query, daily close */
) AS c ON d.symbol = c.symbol AND d.date = c.date
WHERE d.date >= DATE_FORMAT(NOW() - INTERVAL 3 DAY, '%Y%m%d')
AND d.date < DATE_FORMAT(NOW(), '%Y%m%d')
ORDER BY d.symbol, d.date这将给你三天的数据,以昨天结束。您必须将三个摘要查询剪切并粘贴到这个大的胖连接中。我希望您能这样做,因为像这样格式化深度嵌套的查询没有多大乐趣。
这并不简单,但它对您的业务规则非常健壮和明确。
https://stackoverflow.com/questions/20997382
复制相似问题