You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL窗口函数是否存在优先级?LAG与窗口范围搭配的疑问

问题背景

我有一张student_tests表,表结构及数据如下:

test_id    marks 
   100        55
   101        55
   102        60
   103        58
   104        40

为了获取每行marks列的上一条记录,我执行了如下SQL查询:

select *,LAG(marks,1,marks) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev
from student_tests

查询结果符合预期,但我存在疑问:同时指定RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW窗口范围与LAG函数的偏移量1为何不会报错?两者背后是否存在优先级机制?

解答

这两者不存在冲突,也没有所谓的“优先级”,本质是窗口范围定义了函数可访问的数据集边界,而LAG这类偏移函数是在该数据集内按规则定位目标行,属于协作关系:

  • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW是窗口框架子句,它规定当前行的窗口包含从结果集第一行到当前行的所有数据,为LAG函数划定了可操作的数据池。
  • LAG(marks,1,marks)是偏移分析函数,它的作用是在当前窗口的有序数据中,定位到当前行往前偏移1位的记录。这里由于未显式指定ORDER BY,数据库会默认按存储顺序(或隐含的主键顺序,比如test_id)排序,因此能正确获取到上一行的marks值。

简言之,窗口框架是给偏移函数划定操作范围,偏移函数在该范围内执行具体的偏移定位逻辑,二者功能互补,因此不会触发报错。

内容的提问来源于stack exchange,提问作者Devarapalli Vamsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:23:13