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;