从每5行中选择最高价格

时间:2012-12-10 22:26:00

标签: mysql

我一直在努力尝试并且无法解决这个问题。

在具有开盘价,最高价,最低价,收盘价的股票图表中,您可以随时绘制每分钟,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

2 个答案:

答案 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;

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