0

ストアド プロシージャ内で平均を計算する SQL ステートメントがいくつかあります。

SELECT AVG(x) INTO _5dayaverage FROM (SELECT x FROM my_data ORDER BY create_date DESC LIMIT 5) AS temptable;
SELECT AVG(x) INTO _10dayaverage FROM (SELECT x FROM my_data ORDER BY create_date DESC LIMIT 10) AS temptable;

派生テーブルを使用する代わりに、SELECT を 1 回だけ実行するような方法でこれらを記述することは可能ですか? 5 日、10 日、20 日、28 日、30 日、35 日、50 日の平均を計算する必要があるため、SELECT を何度も実行する代わりに、1 回のクエリですべてを実行できますか?

4

2 に答える 2

4

MySQLで行番号を取得するには、インクリメント変数を使用する必要があります。

SELECT  AVG(CASE WHEN RowNumber <= 5 THEN X END) AS Avg_5,
        AVG(CASE WHEN RowNumber <= 10 THEN X END) AS Avg_10,
        AVG(CASE WHEN RowNumber <= 15 THEN X END) AS Avg_15,
        AVG(CASE WHEN RowNumber <= 20 THEN X END) AS Avg_20,
        AVG(CASE WHEN RowNumber <= 25 THEN X END) AS Avg_25,
        AVG(CASE WHEN RowNumber <= 30 THEN X END) AS Avg_30,
        AVG(CASE WHEN RowNumber <= 35 THEN X END) AS Avg_35
FROM    (   SELECT  @i:= @i + 1 AS RowNumber, x
            FROM    My_Data,
                    (SELECT @i:=0) AS i
            ORDER BY Create_Date DESC
        ) AS Data

http://sqlfiddle.com/#!2/7a250/1

于 2012-06-13T15:36:35.473 に答える
4

ROW_NUMBER()共通テーブル式で使用できます。SQL Server 2005 以降を使用していると仮定します。

WITH Numbered AS (
SELECT ROW_NUMBER() OVER(ORDER BY create_date DESC) AS RowNum,
   X
FROM my_data)

SELECT AVG(CASE WHEN RowNum <= 5 THEN X ELSE NULL END) AS _5_Day_Avg,
   AVG(CASE WHEN RowNum <= 10 THEN X ELSE NULL END) AS _10_Day_Avg
FROM Numbered
于 2012-06-13T15:10:05.313 に答える