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
相关产品推荐
相关产品推荐

