ERROR 1064 (42000) 过度分区语法中的数据库错误

Posted

技术标签:

【中文标题】ERROR 1064 (42000) 过度分区语法中的数据库错误【英文标题】:ERROR 1064 (42000) database error in syntax of over partition by 【发布时间】:2020-01-25 18:16:30 【问题描述】:
mysql> select * from FinalTable;
+------+-------+-------+---------------------+
| id   | name  | state | timestamp           |
+------+-------+-------+---------------------+
|   12 | name1 | TX    | 2020-01-25 11:29:36 |
|   14 | name3 | CA    | 2020-01-25 11:29:36 |
|   14 | name3 | TX    | 2020-01-25 11:29:36 |
|   12 | name1 | CA   | 2020-01-25 11:29:36 |
|   13 | name2 | TA   | 2020-01-25 11:29:36 |
|   14 | name3 |  CA   | 2020-01-25 11:29:36 |
+------+-------+-------+---------------------+

我正在查看输出查询,其响应为:

I2 name1 TX 2020-01-25 11:29:36  CA 2020-01-25 11:29:36

当我运行查询时,

select id,name,state,timestamp,
lead(state,1) over (partition by id order by timestamp asc) out_state,
lead(timestamp,1) over (partition by id order by timestamp asc) out_timestamp
from FinalTable

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(partition by id order by timestamp asc) out_state,
lead(timestamp,1) over (part' at line 2

还可以在数据库中创建毫秒而不是秒的时间戳吗? 我正在使用 CURRENT_TIMESTAMP。

【问题讨论】:

你的 MySql 版本是多少? Ver 14.14 发行版 5.7.28 Ubantu 【参考方案1】:

窗口函数(例如lead())仅在 MySQL 8.0 中添加,因此在 5.7 版本中不可用。你可以用这样的自加入来模拟lead()

select t.*, tlead.state, tlead.timestamp
from FinalTable t
left join FinalTable tlead 
    on tlead .id = t.id
    and tlead.timestamp = (
        select min(t1.timestamp) 
        from FinalTable t1 
        where t1.id = t.id and t1.timestamp > t.timestamp
    )

旁注:要使此方法正常工作,您需要相同id 的后续记录具有不同的timestamps - 在您显示的示例数据中并非如此,所有时间戳都相同(我认为这是您的示例数据中的拼写错误)。

【讨论】:

谢谢。我计划根据您的评论thankq升级到mysql8。还有如何以毫秒为单位设置时间

以上是关于ERROR 1064 (42000) 过度分区语法中的数据库错误的主要内容,如果未能解决你的问题,请参考以下文章

ERROR 1064 (42000):您的 SQL 语法有错误;想要将密码配置为 root 作为用户

ERROR 1064 (42000)MySQL中使用mysqladmin或set修改root密码时提示语法错误

错误 1064 (42000) : 使用 %s 附近的 SQL 语法有错误

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误

Mysql错误 ERROR 1064 (42000): You have an error in your SQL syntax

ERROR 1064 (42000)