18

良い一日、

次のコードを使用して、9 日移動平均を計算しています。

SELECT SUM(close)
FROM tbl
WHERE date <= '2002-07-05'
AND name_id = 2
ORDER BY date DESC
LIMIT 9

ただし、制限が呼び出される前に返されたすべてのフィールドを最初に計算するため、機能しません。つまり、過去 9 日間だけでなく、その日付以前のすべての終値を計算します。

したがって、直接計算するのではなく、返された選択から SUM を計算する必要があります。

すなわち。SELECT... から SUM を選択します。

どうすればこれを行うことができますか?それは非常に費用がかかりますか、それともより良い方法がありますか?

4

5 に答える 5

6

次のようなものを使用します

SELECT 
  sum(close) as sum,
  avg(close) as average
FROM (
    SELECT 
      (close)
    FROM 
      tbl
    WHERE 
      date <= '2002-07-05'
      AND name_id = 2
    ORDER BY 
      date DESC
    LIMIT 9 ) temp

内部クエリは、フィルター処理されたすべての行をdesc順番に返します。次に、返された行を上avgsum上げます。

queryあなたによって与えられたが機能しない理由は、sumが最初に計算され、がすでに計算LIMITされた後に句が適用され、存在するすべての行のsumsum

于 2013-04-20T13:53:37.157 に答える
0

このクエリは高速です。

select date, name_id,
case @i when name_id then @i:=name_id else (@i:=name_id)
and (@n:=0)
and (@a0:=0) and (@a1:=0) and (@a2:=0) and (@a3:=0) and (@a4:=0) and (@a5:=0) and (@a6:=0) and (@a7:=0) and (@a8:=0)
end as a,
case @n when 9 then @n:=9 else @n:=@n+1 end as n,
@a0:=@a1,@a1:=@a2,@a2:=@a3,@a3:=@a4,@a4:=@a5,@a5:=@a6,@a6:=@a7,@a7:=@a8,@a8:=close,
(@a0+@a1+@a2+@a3+@a4+@a5+@a6+@a7+@a8)/@n as av
from tbl,
(select @i:=0, @n:=0,
        @a0:=0, @a1:=0, @a2:=0, @a3:=0, @a4:=0, @a5:=0, @a6:=0, @a7:=0, @a8:=0) a
where name_id=2
order by name_id, date

50 個または 100 個以上の値の平均が必要な場合、書くのは面倒ですが、努力する価値はあります。オーダーセレクトに近い速度です。

于 2016-03-23T19:49:49.437 に答える