MySQL Error number: 3588; Symbol: ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE; SQLSTATE: HY000

文档解释

Error number: 3588; Symbol: ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE; SQLSTATE: HY000

Message: Window ‘%s’ with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed.

错误说明:ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE错误,隶属于MySQL“编码、更新和特性更改错误”分类,是MySQL在查询窗口函数(Window Functions)中使用range frame时,指定的framing_bound时间范围类型(temporal type)不正确或不支持而引起的错误。ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE错误的SQLSTATE是HY000,错误码为3588。

常见案例

SELECT avg(population) OVER (

ORDER BY founded_date

RANGE FRAME UNBOUNDED PRECEDING

)

FROM city_populations;

其中,group by子句使用UNBOUNDED PRECEDING framing_bound指定保持时间范围。而MySQL是不支持在range frame子句中使用时间范围的,所以就会报错:ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE(ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE 3588)。

解决方法:解决这一错误需要查询范围类型(framing_bound)进行重新指定。MySQL在Window Functions中 range frame子句中支持以下framing_bound类型:

1、ROWS/ROWS BETWEEN/BETWEEN

2、PRECEDING/FOLLOWING (在8.0以上版本中支持)

3、CURRENT ROW (在8.0以上版本中支持)

所以,针对以上这个例子,如果MySQL版本低于8.0,则需要修改前面的framing_bound为类型为PRECEDING 和 FOLLOWING;如果MySQL版本是8.0以上,则可以按照以下方式修改:

SELECT avg(population) OVER (

ORDER BY founded_date

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

)

FROM city_populations;

你可能感兴趣的