Tema SQL
ANY_VALUE() (MySQL / MariaDB)
Suprime ambigüedad ONLY_FULL_GROUP_BY eligiendo arbitrariamente un valor de columna no agrupada dentro de un grupo. Uso deliberado cuando aceptas cualquier representante (p. ej. todas las filas del grupo comparten el mismo valor).
Descripción
ANY_VALUE(expr) indica al optimizador que cualquier fila del grupo sirve para expr. No es agregación lógica: es una válvula de compatibilidad. Si los valores difieren dentro del grupo, el resultado es no determinista. Prefiere MIN/MAX, ANY_VALUE documentado, o reescribir con ventanas. En PostgreSQL debes agregar o agrupar; en SQL Server error equivalente sin GROUP BY completo.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
ANY_VALUE(expresión)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- ONLY_FULL_GROUP_BY
- Activo en modos estrictos de MySQL 5.7+.
- Riesgo
- No uses si el grupo puede tener valores distintos en esa columna.
Ejemplos
Ejemplo 1
SELECT depto_id, ANY_VALUE(jefe_id) AS un_jefe
FROM empleados
GROUP BY depto_id;
SELECT categoria, ANY_VALUE(imagen_url) AS thumb
FROM productos
GROUP BY categoria;
Ejemplo 2
SELECT categoria_id, ANY_VALUE(imagen) AS img
FROM productos
WHERE activo = 1
GROUP BY categoria_id;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.