MySQL使用LAG()和OVER()函数报错1064是什么原因?如何修复?
问题原因
你遇到的1064语法错误是因为当前使用的MySQL版本低于8.0,LAG()这类窗口函数、以及配套的OVER()语法是MySQL 8.0版本才正式新增的特性,5.7及更早的MySQL版本完全不支持该语法,所以执行时会把OVER识别为非法关键字,抛出语法错误。
修复方案
方案1:升级MySQL版本(最推荐)
直接将MySQL服务升级到8.0及以上版本,升级完成后你原本写的SQL不需要做任何修改即可正常运行,执行最后一条查询语句返回的结果如下:
| id | myDate | curNum | LAG(myNum, 1) OVER(ORDER BY id) |
|---|---|---|---|
| 1 | Mon | 4 | NULL |
| 2 | Tue | 6 | 4 |
| 3 | Wed | 3 | 6 |
方案2:兼容低版本MySQL的替代写法
如果暂时无法升级MySQL版本,可以用以下两种写法实现和LAG()完全一致的效果:
- 自连接实现(适合id连续递增的场景)
SELECT a.id, a.myDate, a.myNum as curNum, b.myNum as lag_myNum FROM db001.myTable001 a LEFT JOIN db001.myTable001 b ON a.id = b.id + 1 ORDER BY a.id;
- 用户变量实现(不受id连续性限制)
SELECT id, myDate, myNum as curNum, @prev_num as lag_myNum, @prev_num := myNum FROM db001.myTable001, (SELECT @prev_num := NULL) init ORDER BY id;
内容的提问来源于stack exchange,提问作者H42
相关产品推荐
相关产品推荐

