Is there any way other than using the cursor or while loop to check the current row with the next row and update the current row and do this through all rows in the data set?
For example, this is the table we have:
x
id date value
1 2020-09-01 00:00:00.000 0.00
2 2020-09-01 00:15:00.000 0.30
3 2020-09-01 00:30:00.000 0.00
4 2020-09-01 00:45:00.000 0.15
5 2020-09-01 01:00:00.000 0.20
6 2020-09-01 01:15:00.000 0.10
7 2020-09-01 01:30:00.000 0.10
8 2020-09-01 01:45:00.000 0.00
9 2020-09-01 02:00:00.000 0.00
declare @i int = 1, @new_value money = 0.3
while @i <= 10
begin
select @new_value = iif(value> (@new_value * 0.2) and value < @new_value,
value,
@new_value)
from table
where value >= 0.1
and id = @i + 1;
set @i = @i + 1
end
select @new_value -- Output will be 0.10
This while loop go through each row and update @new_value based on some conditions and then check with the next row.
I would like to see if there is any way not to use a loop or cursor and get the same result.
Advertisement
Answer
Here it is in recursive cte
declare @tbl table
(
id int,
[value] decimal(5,2)
)
insert into @tbl values
(1, 0.00),
(2, 0.30),
(3, 0.00),
(4, 0.15),
(5, 0.20),
(6, 0.10),
(7, 0.10),
(8, 0.00),
(9, 0.00);
declare @new_value decimal(5,2) = 0.3;
with rcte as
(
select id, value,
new_value = iif(value > (@new_value * 0.2)
and value < @new_value,
value,
new_value)
from @tbl
where id = 1
union all
select t.id, t.value,
new_value = iif(t.value > (r.new_value * 0.2)
and t.value < r.new_value,
t.value,
r.new_value)
from rcte r
inner join @tbl t on r.id = t.id - 1
)
select *
from rcte