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

带RANGE BETWEEN窗口框架的LAG()函数超出范围仍返回前序记录值的问题咨询

带RANGE BETWEEN窗口框架的LAG()函数超出范围仍返回前序记录值的问题咨询

大家好,我最近在使用窗口函数时遇到了一个困惑:我想通过lag()函数获取当前记录的前一条值,但同时希望这个lag()只在指定的时间范围内生效——也就是只有当前一条记录落在"当前行日期往前1个月"的区间里时,才返回它的值,否则返回NULL。

我尝试写了如下的SQL代码,其中avg()函数计算的past_month_avg结果是符合预期的,但lag()的输出却和我想的不一样:

WITH orders (custkey, orderdate, totalprice) 
AS 
(
VALUES
('cust_1', DATE '2020-10-10', 100),
('cust_2', DATE '2020-10-10', 15),
('cust_1', DATE '2020-10-15', 200),
('cust_1', DATE '2020-10-16', 240),
('cust_2', DATE '2020-12-20', 25),
('cust_1', DATE '2020-12-25', 140),
('cust_2', DATE '2021-01-01', 5)    
)

SELECT *, 
       avg(totalprice) OVER (
                             PARTITION BY custkey
                             ORDER BY orderdate
                             RANGE BETWEEN INTERVAL '1' MONTH PRECEDING AND CURRENT ROW) AS past_month_avg,
    
       lag(totalprice) OVER ( 
                             PARTITION BY custkey
                             ORDER BY orderdate
                             RANGE BETWEEN INTERVAL '1' MONTH PRECEDING AND CURRENT ROW) AS past_month_prev_price
FROM orders;

举个具体的例子:看cust_1在2020-12-25的那条记录,它的past_month_avg是140,这说明窗口里只有它自己(前一条记录的日期是2020-10-16,距离当前日期超过1个月,不在窗口范围内),但past_month_prev_price却返回了240——也就是那条超出时间范围的前序记录的值。

我想请教一下:是不是lag()函数本身不支持通过RANGE BETWEEN来限定它的窗口范围?还是我的语法写法有问题?有没有办法实现我想要的效果——让lag()只返回指定时间范围内的前一条记录值?

备注:内容来源于stack exchange,提问作者Emman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:54:32