【问题标题】:stored procedure returning a calculated resultset返回计算结果集的存储过程
【发布时间】:2012-08-16 07:13:13
【问题描述】:

我有一张这样的桌子

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可以获取每个区间的平均值?

【问题讨论】:

    标签: mysql sql stored-procedures cursor


    【解决方案1】:

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

    我将从创建一个数字表开始。 (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 知识缺乏了解)

    【讨论】:

      【解决方案2】:

      也许你可以在一个查询中尝试这样的事情:

      SELECT DATE_FORMAT(TIMEDIFF('08:12','08:10'), '%m') AS time, AVG(value) avg_value
      FROM table_name
      GROUP BY 1
      ORDER BY avg_value DESC;
      

      【讨论】:

      • 感谢答案,但给定的每个间隔的 AVG(value) 始终与 value 相同,并且平均值为 (8:10, 8:11, 0) 和 (8:12, 8: 19, 10) 不是 5 而是 1
      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 2011-04-22
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多