mysql - 从每 5 行中选择最高价格

标签 mysql

我一直在尝试,但一直无法解决这个问题。

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

感谢您的想法和讨论。

贾罗德

最佳答案

这应该每 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 分钟的时间跨度。结果将是一个浮点值。但我们需要在特定时间跨度内具有相同的值。因此就有了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 

关于mysql - 从每 5 行中选择最高价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810356/

相关文章:

php - MySQL 查询没有获取正确的结果

mysql - mySQL 的速度和调整(10 亿行)

java - 在java中准备语句时使用long而不是int有什么缺点吗?

php - 通过 PDO+mySQL 排序不起作用

mysql - 这个子选择是在 where 子句之前还是之后执行?

MySQL Order By 不适用于所有记录

java - 错误 : org. hibernate.PersistentObjectException:分离的实体传递给持久化

mysql - 自动 Access DB5到MySQL

mysql插入选择难题

java - 如果用户在 mysql 长查询中间关闭页面怎么办?