如何正确编写LAG函数?MySQL日期差计算报错求助
问题原因与解决办法
语法错误根源:
Lag是MySQL的关键字,直接将它用作列别名会触发语法报错。解决方式有两种:- 用反引号包裹别名:
AS \Lag`` - 更换为非关键字别名,比如
AS prev_date
- 用反引号包裹别名:
逻辑错误修正:你的窗口分区条件
PARTITION BY YEAR, MONTH, DAY完全不合理——这会把每个单独的日期拆成一个独立分区,导致LAG函数根本无法获取到上一行数据。要实现“获取上一行日期”的需求,应该去掉不必要的分区(如果不需要按特定维度分组),直接按完整日期排序:
修正后的基础SQL(解决语法+逻辑问题):
SELECT YEAR, MONTH, DAY, lag(DATE) OVER (ORDER BY DATE) AS prev_date FROM DATASET;
如果需要按特定维度(比如年份)分组内获取上一行日期,可以调整分区条件:
SELECT YEAR, MONTH, DAY, lag(DATE) OVER (PARTITION BY YEAR ORDER BY DATE) AS prev_year_date FROM DATASET;
- 扩展:计算日期天数差
拿到上一行日期后,用DATEDIFF函数即可计算天数差:
SELECT YEAR, MONTH, DAY, DATE, lag(DATE) OVER (ORDER BY DATE) AS prev_date, DATEDIFF(DATE, lag(DATE) OVER (ORDER BY DATE)) AS day_diff FROM DATASET;
内容的提问来源于stack exchange,提问作者DouL
相关产品推荐
相关产品推荐

