希望按时间增量从mysql表中获取行

希望按时间增量从mysql表中获取行,mysql,Mysql,我有一个mysql表,我正在为它存储我的提要接收的股票报价数据。数据看起来像下表,有多个表,其中至少有3M行 id datetime size value 7321798, '2010-12-11 00:00:00', 3, 1384.6 7321799, '2010-12-11 00:00:00', 1, 1384.6 7321800, '2010-12-11 00:00:00', 1, 1384.7 7321801,

我有一个mysql表,我正在为它存储我的提要接收的股票报价数据。数据看起来像下表,有多个表,其中至少有3M行

id datetime size value 7321798, '2010-12-11 00:00:00', 3, 1384.6 7321799, '2010-12-11 00:00:00', 1, 1384.6 7321800, '2010-12-11 00:00:00', 1, 1384.7 7321801, '2010-12-11 00:00:00', 1, 1384.8 7321802, '2010-12-11 00:00:03', 1, 1384.7 7321803, '2010-12-11 00:00:04', 1, 1384.6 7321804, '2010-12-11 00:00:04', 2, 1384.6 7321805, '2010-12-11 00:00:04', 1, 1384.6 7321806, '2010-12-11 00:00:04', 1, 1384.7 7321807, '2010-12-11 00:00:05', 1, 1384.5 7321808, '2010-12-11 00:00:05', 1, 1384.3 7321809, '2010-12-11 00:00:06', 3, 1384.3 7321810, '2010-12-11 00:00:06', 2, 1384.3 7321811, '2010-12-11 00:00:06', 1, 1384.3 7321812, '2010-12-11 00:00:06', 1, 1384.4 7321813, '2010-12-11 00:00:06', 1, 1384.5 7321814, '2010-12-11 00:00:06', 4, 1384.6 7321815, '2010-12-11 00:00:07', 1, 1384.6 7321816, '2010-12-11 00:00:07', 5, 1384.6 7321817, '2010-12-11 00:00:08', 1, 1384.6 7321818, '2010-12-11 00:00:09', 3, 1384.7 ............ ............. ............... .................. id日期时间大小值 7321798, '2010-12-11 00:00:00', 3, 1384.6 7321799, '2010-12-11 00:00:00', 1, 1384.6 7321800, '2010-12-11 00:00:00', 1, 1384.7 7321801, '2010-12-11 00:00:00', 1, 1384.8 7321802, '2010-12-11 00:00:03', 1, 1384.7 7321803, '2010-12-11 00:00:04', 1, 1384.6 7321804, '2010-12-11 00:00:04', 2, 1384.6 7321805, '2010-12-11 00:00:04', 1, 1384.6 7321806, '2010-12-11 00:00:04', 1, 1384.7 7321807, '2010-12-11 00:00:05', 1, 1384.5 7321808, '2010-12-11 00:00:05', 1, 1384.3 7321809, '2010-12-11 00:00:06', 3, 1384.3 7321810, '2010-12-11 00:00:06', 2, 1384.3 7321811, '2010-12-11 00:00:06', 1, 1384.3 7321812, '2010-12-11 00:00:06', 1, 1384.4 7321813, '2010-12-11 00:00:06', 1, 1384.5 7321814, '2010-12-11 00:00:06', 4, 1384.6 7321815, '2010-12-11 00:00:07', 1, 1384.6 7321816, '2010-12-11 00:00:07', 5, 1384.6 7321817, '2010-12-11 00:00:08', 1, 1384.6 7321818, '2010-12-11 00:00:09', 3, 1384.7 ............ ............. ............... .................. 现在我想要总共250行,在这种方式下,我可以通过一分钟的分割得到每一行,分割的数据将是该范围内的最高值、该范围内的最低值以及该时间范围内的列大小总和:

因此,数据获取应该类似于

time highval lowval total of size 2010-12-11 00:00:00 1300 1200 235 2010-12-11 00:01:00 1258 1125 3000 2010-12-11 00:02:00 1440 1312 15000 时间上限值下限值总大小 2010-12-11 00:00:00 1300 1200 235 2010-12-11 00:01:00 1258 1125 3000 2010-12-11 00:02:00 1440 1312 15000 等等

(在上述结果中,如果我请求数据,它将在最初给出的1分钟时间范围内获得大小列的最高值、最低值和总计(总和),然后继续,直到行的总计结果变为250)

如果这可以通过单行查询实现,那就好了,或者请告诉我创建存储过程的步骤。

类似于:

SELECT 
    DATE_FORMAT(datetime,"%Y-%m-%c %H:%i") AS date,
    MAX(value) AS max_value,
    MIN(value) AS min_value,
    SUM(size) AS size_total
FROM table
GROUP BY DATE(datetime),HOUR(datetime),MINUTE(datetime)
我相信其他海报将有一个更优雅的解决方案,但这组在所有时间域从分钟到给你分钟分组

编辑: 超过一分钟的分组和最后一天的分组可以通过以下方式完成:

SELECT 
    DATE_FORMAT(MIN(datetime),"%Y-%m-%c %H:%i") AS startDate,
    DATE_FORMAT(MAX(datetime),"%Y-%m-%c %H:%i") AS endDate,
    MAX(value) AS max_value,
    MIN(value) AS min_value,
    SUM(size) AS size_total
FROM table
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY DATE(datetime),HOUR(datetime),FLOOR(MINUTE(datetime)/2)
这可以确保,例如,分钟0和分钟1具有相同的组。 同样,我相信其他海报可能有更优雅的解决方案


有关此方法的更多信息,请参阅上的文档。

根据OP的描述,我认为{MAX(size)}和{MIN(size)}应该是{MAX(value)}和{MIN(value)}。谢谢你的回答。我真的很感激这一点,但我需要知道,如果我需要以2分钟的增量获取数据,那么通过使用相同的查询,需要对现有查询进行哪些更改。再次感谢,是的,还有一件事,数据库包含数百万行,因此此查询执行需要时间。是否有其他有效的方法快速获得结果。。。请帮帮我,我在stuck@user1278274更新了问题:)@user1278274您使用的是哪种数据库?你试过在这个表上使用索引吗?如果您知道每分钟都有条目,那么您可以始终将查询限制为仅在过去250分钟内进行:
WHERE DATEADD(mi,-250,GETDATE())