Redshift为何要求按所有列分组?Aurora SQL迁移查询遇阻求助
问题分析
- 错误根源:你在CASE语句里直接引用了原表的
cantidad_retornos列,而非聚合后的统计结果。Redshift严格遵循SQL标准,要求SELECT中的所有非聚合列必须出现在GROUP BY中,或者用聚合函数包裹。 - Aurora能正常运行的原因:Aurora(MySQL兼容)默认允许非聚合列与GROUP BY列存在函数依赖时省略(比如id是主键,rut、name依赖id),但Redshift不支持这种宽松规则,必须严格执行标准。
修正后的查询语句
select rut, name, id, sum(cantidad_retornos) as cantidad_retornos, sum(cantidad_aceptadas) as cantidad_aceptadas, sum(cantidad_auto_accept) as cantidad_auto_accept, sum(cantidad_rechazadas) as cantidad_rechazadas, sum(cantidad_aceptadas) - sum(cantidad_auto_accept) as cantidad_aceptadas_manual, coalesce((sum(cantidad_aceptadas) - sum(cantidad_auto_accept)) / nullif(sum(cantidad_aceptadas),0)) as per_aceptadas_manual, coalesce(sum(cantidad_auto_accept) / nullif(sum(cantidad_aceptadas),0),0) as per_aceptadas_auto, coalesce(sum(cantidad_rechazadas) / nullif(sum(cantidad_retornos),0),0) AS rechazo_per, case when coalesce(sum(cantidad_rechazadas) / nullif(sum(cantidad_retornos),0) ,0) < 0.1 or sum(cantidad_retornos) < 10 then 'Confiable' when coalesce(sum(cantidad_rechazadas) / nullif(sum(cantidad_retornos),0),0) >= 0.1 and coalesce(sum(cantidad_rechazadas) / nullif(sum(cantidad_retornos),0),0) < 0.5 then 'Estándar' when coalesce(sum(cantidad_rechazadas) / nullif(sum(cantidad_retornos),0),0) >= 0.5 then 'Poco confiable' else 'Sin clasificar' end as nivel_confianza from table where 1=1 group by id, name, rut
关键修改点
- 将CASE语句中的
cantidad_retornos < 10替换为sum(cantidad_retornos) < 10,确保引用的是分组后的总返回量,而非单条记录的返回量。 - 保持GROUP BY仅包含
id, name, rut,这三列是你需要的分组维度,符合预期结果需求。
内容的提问来源于stack exchange,提问作者gas
相关产品推荐
相关产品推荐

