使用 SELECT 查询从小间隔和聚合值创建更大的 DATETIME 间隔

问题描述 投票:0回答:1

我在 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

不兼容

你知道如何真正让它发挥作用吗?我尝试修改这些查询以使其正常工作,但没有成功。

sql mysql group-by partitioning partition
1个回答
0
投票

尽量不要让事情变得过于复杂。我认为您的初始查询几乎就是您想要的(但要小心“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);
© www.soinside.com 2019 - 2024. All rights reserved.