Reputation: 79
I'm trying to make a script to calculate "SHI" Column using SQL based on this table.
| Day | BR | BR2 | HI | SHI |
----------------------------------
| 1 | 0 | 0 | 0 | 0 |
| 2 | 400 | 400 | 95 | 95 |
| 3 | 0 | 400 | 0 | 95 |
| 4 | 350 | 750 | 100 | 97.33 |
| 5 | 350 |1100 | 100 | 98.18 |
I need to calculate the SHI Column using:
SHI = ((BR * HI) + (Prev.SHI * Prev.BR2)) / BR2
Just to be clear, the SHI Column do not exist in my data yet. That is what I am trying to have my query calculate. My problem is, I don't know how to get the previous SHI Value to insert on that formula for current day.
Any idea how to create this in SQL?
Upvotes: 1
Views: 86
Reputation: 15893
With cte you can achieve your desired result.
with cte as
(
select day,br,br2,hi,(case when br2<>0 and br2 is not null then coalesce(round( ((br*hi))/br2,2),0) else 0 end)SHI from S66312677V2 where day=1
union all
select s.day,s.br,s.br2,s.hi,
(case when s.br2<>0 and s.br2 is not null then coalesce(round( ((s.br*s.hi)+cte.shi*cte.br2)/s.br2,2),0) else 0 end)SHI from S66312677V2 s
inner join cte on s.day-1=cte.day
where s.day<>1
)
select * from cte
Output:
If number of rows is more than 100 then use OPTION (MAXRECURSION xxx) to set a larger recursion limit up-to 32,767 as below:
with cte as
(
select day,br,br2,hi,(case when br2<>0 and br2 is not null then coalesce(round( ((br*hi))/br2,2),0) else 0 end)SHI from S66312677V2 where day=1
union all
select s.day,s.br,s.br2,s.hi,
(case when s.br2<>0 and s.br2 is not null then coalesce(round( ((s.br*s.hi)+cte.shi*cte.br2)/s.br2,2),0) else 0 end)SHI from S66312677V2 s
inner join cte on s.day-1=cte.day
where s.day<>1
)
select * from cte
OPTION (MAXRECURSION 999)
Upvotes: 2