トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

8-8 加重移動平均を求める

SQLパズル

終値推移テーブル
日付         終値
----------  -----
2006/03/08    120
2006/03/09    480
2006/03/10   6000
2006/03/11  12000
2006/03/14  72000
2006/03/15  24000
2006/03/16   1200
2006/03/17    120
2006/03/18  12000
2006/03/22  24000
2006/03/23  96000

5日移動平均と、
5日加重移動平均を
以下の形式で求める。

5日加重移動平均 = (5*当日終値 + 4*前日終値 + 3*2日前終値 + 2*3日前終値 + 1*4日前終値) / (5+4+3+2+1)

出力結果
日付         終値  移動平均   加重移動平均
----------  -----  --------  ------------
2006/03/08    120       120           120
2006/03/09    480       300           320
2006/03/10   6000      2200          2690
2006/03/11  12000      4650          6120
2006/03/14  72000     18120         28472
2006/03/15  24000     22896         30432
2006/03/16   1200     23040         23200
2006/03/17    120     21864         15560
2006/03/18  12000     21864         12272
2006/03/22  24000     12264         12984
2006/03/23  96000     26664         40896


SQL

with 終値推移 as(
select to_date('2006/03/08','YYYY/MM/DD') as 日付,  120 as 終値 from dual
union select to_date('2006/03/09','YYYY/MM/DD')  ,  480 from dual
union select to_date('2006/03/10','YYYY/MM/DD')  , 6000 from dual
union select to_date('2006/03/11','YYYY/MM/DD')  ,12000 from dual
union select to_date('2006/03/14','YYYY/MM/DD')  ,72000 from dual
union select to_date('2006/03/15','YYYY/MM/DD')  ,24000 from dual
union select to_date('2006/03/16','YYYY/MM/DD')  , 1200 from dual
union select to_date('2006/03/17','YYYY/MM/DD')  ,  120 from dual
union select to_date('2006/03/18','YYYY/MM/DD')  ,12000 from dual
union select to_date('2006/03/22','YYYY/MM/DD')  ,24000 from dual
union select to_date('2006/03/23','YYYY/MM/DD')  ,96000 from dual)
select to_char(日付,'YYYY/MM/DD') as 日付,終値,
avg(終値) over(order by 日付 Rows (5-1) Preceding) as 移動平均,
(
1*Lag(終値,4,0) over(order by 日付)+
2*Lag(終値,3,0) over(order by 日付)+
3*Lag(終値,2,0) over(order by 日付)+
4*Lag(終値,1,0) over(order by 日付)+
5*終値) /
(
Lag(1,4,0) over(order by 日付)+
Lag(2,3,0) over(order by 日付)+
Lag(3,2,0) over(order by 日付)+
Lag(4,1,0) over(order by 日付)+
5) as 加重移動平均
  from 終値推移
order by 日付;


解説

Lag関数の引数に、定数を指定してます。

8-5 移動平均を求める

移動平均線とは