我一直在尝试,但一直无法解决这个问题。
在具有开盘价、最高价、最低价、收盘价的股票图表中,您始终可以绘制每分钟、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/