mysql - 返回计算结果集的存储过程

标签 mysql sql stored-procedures cursor

我有一张这样的 table

from   | to     | value
-----------------------
08:10  | 08:12  | 2
08:13  | 08:20  | 5
08:30  | 08:45  | 3
08:46  | 08:55  | 1

我需要按 1、10、60 分钟的间隔进行分组并获取平均值,假设每一分钟都有一个值。

注意:范围之间有空洞,从包含到不包含

from   | to     | average_value
-----------------------
08:10  | 08:19  | 4
08:20  | 08:29  | 5
08:30  | 08:39  | 3
08:40  | 08:49  | 2
08:50  | 08:59  | 1

我的想法是使用存储过程将条目转换为

time   | value
-----------------------
08:10  | 2
08:11  | 2
08:12  | 2
08:13  | 5
...
08:20  | 5
08:30  | 3
...
08:45  | 3
08:50  | 1
...
08:55  | 1

我的第一次尝试

DELIMITER $$
CREATE PROCEDURE Decompose()
BEGIN
    DECLARE num_rows INT;
    DECLARE from DateTime;
    DECLARE to DateTime;
    DECLARE value double;

    DECLARE friends_cur CURSOR FOR SELECT from, to, value FROM sourcetable;

    -- 'open' the cursor and capture the number of rows returned
    -- (the 'select' gets invoked when the cursor is 'opened')
    OPEN friends_cur;
    select FOUND_ROWS() into num_rows;

    WHILE num_rows > 0 DO

        FETCH friends_cur INTO  from, to, value;

        SELECT from, value;

        SET num_rows = num_rows - 1;
    END WHILE;

    CLOSE friends_cur;
END$$
DELIMITER ;

导致“命令不同步”错误,因为循环中的每个 SELECT 每次都会创建一个新的结果集,而不是返回一行。

问题:

  • 我可以让存储过程以某种方式工作吗?
  • 是否有一个sql可以获取每个时间间隔的平均值?

最佳答案

我认为你的基本计划是合理的。

我将从创建一个数字表开始。 (Creating a "Numbers Table" in mysql)

然后,将其转换为一个表格,其中包含您希望计算平均值的一天中每一分钟的行(包括那些没有任何值的值)以及一列来指示该特定分钟所属的时间间隔至

Time     Interval
08:00    1
08:01    1
08:02    1
08:03    1
08:04    1
08:05    2
08:06    2
....

然后使用左连接到示例表

ON intervals.Time >= Samples.Time and intervals.Time<Sample.Time

生成间隔查询,然后对其求平均值。

我认为你不需要光标。

(我会给出更具体的例子,但我缺乏对 MySql 的一些 SQL 复杂性的了解)

关于mysql - 返回计算结果集的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11982333/

相关文章:

mysql - 需要有关 MySql 查询的帮助

MySQL Workbench 系统变量差异

mysql - 当产品 ID 相同时将数据复制到列

php - 更改查询以不重复数据

javascript - 如何使用 Azure SQL 数据库中的存储过程一次获取查询的所有批处理?

php - 如何使用动态数组中的值进行 sql 查询?

c# - C#中的数据分区

sql - INSERT statement conflict with the FOREIGN KEY constraint 冲突发生在数据库中

c# - 调用多个存储过程最快的代码是什么?

mysql - 如何在我的 MySQL 存储过程中使用事务?