I have a table with Data for Different Companies and Closing Price for Trading Days. I need to calculate a 3 Day Running Average for every Company. I need to then join with a calendar table to populate Close Price and Avg3DayClosePrice for all dates including Trading Holidays. For trading holidays the values should be of previous trading day.
Part of this is already answered in the post SQL for Dates with no ClosePrice for all companies
3 Day average before including Trading Holiday
select d.date as tdate, d.datekey, t.ticker, fsdc.ClosePrice as cp,
coalesce(fsdc.ClosePrice,
lag(fsdc.ClosePrice, 1) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 2) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 3) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 4) over (partition by t.ticker order by d.date)
) as ClosePrice
-- This is the new addition
,AVG(fsdc.ClosePrice) OVER (partition by t.ticker order by d.date
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS avrg
-- new addition ends
from dimdates d join
(select ticker, min(datekey) as min_datekey
from factStockDividendCommodity fsdc
--where ticker <> 'BP'
group by ticker
) t
on d.datekey >= t.min_datekey left join
factStockDividendCommodity fsdc
on fsdc.ticker = t.ticker and
fsdc.datekey = d.datekey
where d.Date <= GETDATE()
order by ticker, d.Date;
Updated Script:
select d.date as tdate, d.datekey, t.ticker, fsdc.ClosePrice as cp,
coalesce(fsdc.ClosePrice,
lag(fsdc.ClosePrice, 1) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 2) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 3) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 4) over (partition by t.ticker order by d.date)
) as ClosePrice,
coalesce( lag(fsdc.ClosePrice, 1) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 2) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 3) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 4) over (partition by t.ticker order by d.date),
lag(fsdc.ClosePrice, 5) over (partition by t.ticker order by d.date)
) as OpenPrice, av3,
coalesce(fsdc.av3,
lag(fsdc.av3, 1) over (partition by t.ticker order by d.date),
lag(fsdc.av3, 2) over (partition by t.ticker order by d.date),
lag(fsdc.av3, 3) over (partition by t.ticker order by d.date),
lag(fsdc.av3, 4) over (partition by t.ticker order by d.date)
) as Avg3
from
(select * from dimdates where datekey <=20181231) d join
(select ticker, min(datekey) as min_datekey
from factStockDividendCommodity
where ticker <> '5X10TR'
group by ticker
) t
on d.datekey >= t.min_datekey left join
(
select ticker, datekey, ClosePrice, AVG(ClosePrice) OVER (partition by ticker order by datekey
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) Av3
from factStockDividendCommodity
where ticker <> '5X10TR'
) fsdc
on fsdc.ticker = t.ticker and
fsdc.datekey = d.datekey
where d.Date <= GETDATE()
order by ticker, d.Date;