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

