我在 MySQL 中有一个包含股票数据的表,其中包含以下列:
时间 |打开|高|低|关闭 |音量
我每 5 分钟就有一个条目。如何以每小时而不是 5 分钟的间隔获取这些值? 实际上,我想创建一个新表,其中的条目聚合为 1 小时行而不是 12 5 分钟行。开盘价和收盘价必须是 5 分钟间隔内的第一个和最后一个值,高值和低值必须是 5 分钟间隔内的最大值和最小值。只需要总结体积即可。
我尝试通过 ChatGPT 实现这一目标,但当我尝试时,它生成的查询会抛出语法错误。 它给了我这个:
SELECT
DATE_FORMAT(`time`, '%Y-%m-%d %H:00:00') AS hour_start,
FIRST_VALUE(`open`) AS open,
MAX(`high`) AS high,
MIN(`low`) AS low,
LAST_VALUE(`close`) AS close,
SUM(`volume`) AS volume
FROM
table
GROUP BY
hour_start;
=> 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'AS open, MAX(
high
) AS high, MIN(low
) AS low, LAST_VALUE(`clos' at line 3) 附近使用的正确语法
我尝试了几次,也得到了包含“OVER”作为关键字的查询,但它也产生了错误:
SELECT
MIN(`time`) AS `time`,
`open`,
MAX(`high`) AS `high`,
MIN(`low`) AS `low`,
`close`,
SUM(`volume`) AS `volume`
FROM
(SELECT
`time`,
FIRST_VALUE(`open`) OVER (PARTITION BY HOUR(`time`) ORDER BY `time`) AS `open`,
`high`,
`low`,
LAST_VALUE(`close`) OVER (PARTITION BY HOUR(`time`) ORDER BY `time`) AS `close`,
`volume`
FROM
table) AS subquery
GROUP BY
HOUR(`time`),
DATE(`time`)
ORDER BY
`time` ASC;
=> SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列“subquery.open”,该列在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by
不兼容你知道如何真正让它发挥作用吗?我尝试修改这些查询以使其正常工作,但没有成功。
尽量不要让事情变得过于复杂。我认为你的初始查询几乎就是你想要的(但要小心保留字,如“open”或“close”,它们有一个特殊的功能,不能在不引用它们的情况下用作别名。https://dev.mysql .com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-O)
SELECT
MIN(open) AS min_open,
MAX(high) AS max_high,
MIN(low) AS min_low,
MAX(close) AS max_close,
SUM(volume) AS total_volume
FROM
stock
GROUP BY
HOUR(time),
DATE(time);