我一直在努力尝试并且无法解决这个问题。
在具有开盘价,最高价,最低价,收盘价的股票图表中,您可以随时绘制每分钟,5分钟,10分钟,小时等图表。我每分钟都有数据,我正在尝试选择Open,高,低,接近每分钟数据,但每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秒的行的最大值(高)。
与此相似,我需要最小(低),然后我会在时间为090400时获得收盘价,因为我每5分钟收到一次。我也可以使用下一个5分钟增量的开放,这样就很灵活了。
我使用了嵌套的SELECT语句,多个连接等。问题是MySQL执行时间大约是每行返回1秒。当你认为每小时有12行(60分钟/ 5分钟= 12)时,这是疯狂的慢,然后因为我实际上在做FOREX,交易是全天候的,所以24小时。这给了我每天288,或每天不到5分钟。做1年的数据(约250个交易日)大约需要20个小时。必须有一个更快的方式。
我有一些解决方案,ID是连续的,尽管这可能是最容易的,但我并不是100%确定我的数据是否正确。原因是周五交易日在纽约的正常工作时间结束,并在东京的第一笔交易开放(大约在美国中午)。
我看过GROUP BY,但我不确定如何将数据分组以获得5个组,其中每个5分钟组的时间在5分钟内。
感谢您的想法和讨论。
Jarod
答案 0 :(得分:2)
这应该每5分钟显示最大(高)和最小(低)
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分钟的时间跨度。结果将是 float 值。但是我们在特定的时间跨度内需要相同的值。因此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
答案 1 :(得分: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(高),MIN(LOW)FROM tb1 GROUP BY timeStr;