0

我一直在尝试和尝试,但无法弄清楚这一点。

在具有开盘价、最高价、最低价、收盘价的股票图表中,您始终可以每分钟、5 分钟、10 分钟、每小时等图表。我每分钟都有数据,我正在尝试选择开盘价、最高价、最低价, 关闭每分钟的数据,但每 5 分钟。

我有类似这样的数据:

__________________________________________________
| Date     | TIME    | TICKER  | Open  | High  | Low   | Close |
| 20121203 | 090000  |  QQQQ   | 23.54 | 24.12 | 23.01 | 23.24 |
| 20121203 | 090100  |  QQQQ   | 23.24 | 24.14 | 22.98 | 24.13 |
| 20121203 | 090200  |  QQQQ   | 24.13 | 25.88 | 23.75 | 25.81 |
| 20121203 | 090300  |  QQQQ   | 25.81 | 25.83 | 24.63 | 24.99 |
| 20121203 | 090400  |  QQQQ   | 24.99 | 25.21 | 23.89 | 24.12 |
| 20121203 | 090500  |  QQQQ   | 24.12 | 24.19 | 21.94 | 22.03 |
| 20121203 | 090600  |  QQQQ   | 22.03 | 22.97 | 20.68 | 21.44 |
| 20121203 | 090700  |  QQQQ   | 21.44 | 24.06 | 19.32 | 23.56 |
| 20121203 | 090800  |  QQQQ   | 23.56 | 25.48 | 23.07 | 25.01 |
| 20121203 | 090900  |  QQQQ   | 25.01 | 28.00 | 24.18 | 27.21 |
| 20121203 | 091000  |  QQQQ   | 27.21 | 27.55 | 24.31 | 24.31 |

我需要获取时间 >= 090000(即上午 9 点)09 小时 00 分 00 秒的行的最大值(高)。

与此类似,我需要 min(low),然后我将在时间为 090400 时获取收盘价,因为我每 5 分钟获取一次。我也可以使用下一个 5 分钟增量的开盘,这样很灵活。

我使用了嵌套的 SELECT 语句、多个连接等。问题是 MySQL 执行时间大约为每行返回 1 秒。当您计算出每小时有 12 行(60 分钟 / 5 分钟 = 12)时,这真是太慢了,然后因为我实际上在做外汇交易,所以交易是全天候的,所以是 24 小时。这给了我每天 288 次,或者每天不到 5 分钟。做 1 年的数据(约 250 个交易日)大约需要 20 个小时。必须有更快的方法。

我有一些解决方案,ID 是连续的,虽然这可能是最简单的,但我不能 100% 确定我的数据在这样做时是否正确。原因是周五交易日在纽约的正常营业时间结束,并在东京的第一笔交易开始(大约在美国的午后)。

我查看了 GROUP BY,但我不确定如何将数据分组以获得 5 组,其中时间在每个 5 分钟组的 5 分钟内。

感谢您的想法和讨论。

贾罗德

4

2 回答 2

2

这应该每 5 分钟显示一次 max(high) 和 min(low)

SELECT Max(high), 
       Min(low) 
FROM   tbl 
GROUP  BY ROUND(Unix_timestamp(Date(Concat(`date`, `time`))) / ( 5 * 60 )) 

在 Group by 子句中,我们连接您的日期时间列。所以它形成了类似的东西20121203090000。这是在 mysql 中被识别为日期的格式之一。所以我们将它传递给date()函数。然后将其转换为UNIX_TIMESTAMP. 它除以 5 分钟时间跨度。结果将是一个浮点值。但是我们需要特定时间跨度的相同值。因此ROUND(). 它将浮点值设为最接近的整数。要了解它的工作原理,请运行此查询。

SELECT high, 
       low 
       Unix_timestamp(Date(Concat(`date`, `time`))) / ( 5 * 60 ) `5-min span`
       ROUND(Unix_timestamp(Date(Concat(`date`, `time`))) / ( 5 * 60 )) `5-min span rounded`
FROM   tbl 
于 2012-12-10T22:36:13.507 回答
0

试试这个:

SELECT CONCAT(DATE,SUBSTRING(Time,1,2),"[" ,IF(SUBSTRING(Time,4,1)<5,CONCAT(SUBSTRING(Time,3,1),"0"),CONCAT(SUBSTRING(Time,3,1),"5")) ,"-" ,IF(SUBSTRING(Time,4,1)<5,CONCAT(SUBSTRING(Time,3,1),"5"),CONCAT(SUBSTRING(Time,3,1)+1,"0")) ,"]") AS timeStr ,MAX(High) ,MIN(LOW) FROM tb1 GROUP BY timeStr;

http://sqlfiddle.com/#!2/6b748/1

于 2012-12-11T03:47:53.273 回答