0

私はこのようなテーブルを持っています

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分の間隔でグループ化し、各分に1つの値があると仮定して、平均値を取得する必要があります。

注:範囲の間に穴があり、からは包括的から非包括的までです

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はありますか?
4

2 に答える 2

1

基本計画はしっかりしていると思います。

数値表を作成することから始めます。(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 の複雑さについての知識が不足しています)

于 2012-08-16T07:25:58.450 に答える
0

単一のクエリで次のようなことを試すことができるかもしれません:

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;
于 2012-08-16T07:29:10.227 に答える