继续窗口函数之旅 rows与range的区别

先来看一段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

执行结果如图


11.png

可以看到第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

查询结果


222.png

可以看到第5行 new_end结果是我期望的100了。

两个例子可以看出 range 关键字,是以 order by 字段的值 做为基准的。因为最后两行的ord 都 = 5 所以就认为是一样的。

而rows 是行号为基准的。
这就是 rows 与 range的区别。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一般的商业数据库(其实也就是DB2,Oracle,SQL Server)都具备窗口函数这个功能,只不过名称不同,我...
    花讽院_和狆阅读 1,672评论 2 1
  • 一、窗口函数的使用场景 作为IT人士,日常工作中经常会遇到类似这样的需求: 医院看病,怎样知道上次就医距现在的时间...
    carter记录阅读 622评论 0 0
  • 参考: MySQL 8.0窗口函数:用非常规思维简易实现SQL需求 数分面试-SQL篇 一、mysql窗口函数简介...
    kaka22阅读 1,677评论 0 1
  • 高级函数_分析函数与窗口函数 分析函数往往与窗口函数一起使用,over()为窗口函数 一、分析函数 1.01、排名...
    lingoling阅读 1,225评论 0 2
  • 要了解作用域的问题 可先看一下这个问题https://www.jianshu.com/p/5afccb879b80...
    老骥阅读 191评论 0 0

友情链接更多精彩内容