该SQL查询存在以下问题:\n\n1. 子查询的递归CTE(WITH recursive)中使用了时间差函数TIMESTAMPDIFF,但是该函数的参数顺序错误,应该将目标时间('2023-08-01 23:59:00')放在前面,起始时间('2023-07-27 00:06:00')放在后面。\n\n2. 子查询的递归CTE中,将时间差除以15得到一个数值,但是没有给该数值起一个别名,导致后续无法使用。\n\n3. 在LEFT JOIN子查询中,使用了DATE_FORMAT函数对时间进行格式化,但是格式化的精度是到分钟级别('%Y-%m-%d %H:%i'),而实际上主查询中对时间的格式化精度是到秒级别('%Y-%m-%d %H:%i:%s'),这可能导致JOIN条件无法匹配。\n\n4. 主查询中的GROUP BY子句中使用了别名cTime,但是该别名是在子查询中定义的,无法在主查询中直接使用。\n\n5. 主查询中的ORDER BY子句中使用了别名cTime,但是该别名是在子查询中定义的,无法在主查询中直接使用。\n\n综上所述,建议对该SQL查询进行如下修改:\n\nWITH recursive c ( n ) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM c WHERE n < ( SELECT TIMESTAMPDIFF( MINUTE, '2023-08-01 23:59:00', '2023-07-27 00:06:00' ) / 15 ) )\n\nSELECT\nMAX( point_value ) AS num,\nDATE_FORMAT(zpt.real_time,'%Y-%m-%d %H:%i:%s') AS cTime\nFROM\n zdh_point_realdata AS zpt\n LEFT JOIN ( SELECT DATE_FORMAT(date_add( '2023-07-27 00:06:00', INTERVAL n * 15 MINUTE ),'%Y-%m-%d %H:%i:%s') AS cTime FROM c ) AS c ON\n DATE_FORMAT(zpt.real_time,'%Y-%m-%d %H:%i:%s') = c.cTime\nWHERE zpt.uuid = '42d666642f4d11eeb6f3c81f66d08e5a'\nGROUP BY\n cTime\nORDER BY cTime;

SQL 查询分析:递归 CTE 和时间格式化问题

原文地址: https://www.cveoy.top/t/topic/p9vv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录