先来看一段SQL
declare @t table(ord int,billdate varchar(10),add_value int,dec_value int,end_value int)
insert into @t
select 1,'期初',0,0,100 union all
select 2,'2021-01-01',100,0,0 union all
select 3,'2021-01-02',0,100,0 union all
select 4,'2021-01-03',0,100,0 union all
select 5,'2021-01-04',100,0,0 union all
select 5,'2021-01-04',100,0,0
select *,sum(add_value -dec_value + end_value ) over(order by ord) as new_end
from @t a
end_value 这个字段要实现流水账的功能,即 end_value = 第一行期初行 end_value + add_value - decvalue
执行结果如图
可以看到第5行 NEW_END该为100 而不是200
https://www.jianshu.com/p/5afccb879b80
这篇贴子中说过。 order by 没有显示给出行的作用域范围。则默认为
RANGE between UNBOUNDED PRECEDING AND CURRENT ROW
我改为显示指定 并且用ROWS关键字
declare @t table(ord int,billdate varchar(10),add_value int,dec_value int,end_value int)
insert into @t
select 1,'期初',0,0,100 union all
select 2,'2021-01-01',100,0,0 union all
select 3,'2021-01-02',0,100,0 union all
select 4,'2021-01-03',0,100,0 union all
select 5,'2021-01-04',100,0,0 union all
select 5,'2021-01-04',100,0,0
select *,sum(add_value -dec_value + end_value ) over(order by ord rows between UNBOUNDED PRECEDING AND CURRENT ROW) as new_end
from @t a
查询结果
可以看到第5行 new_end结果是我期望的100了。
两个例子可以看出 range 关键字,是以 order by 字段的值 做为基准的。因为最后两行的ord 都 = 5 所以就认为是一样的。
而rows 是行号为基准的。
这就是 rows 与 range的区别。