-
Sí. Las columnas no agregadas son cualquier columna que no use una función de agregación como
MAX
,COUNT
,SUM
,GROUP_CONCAT
, etc. -
Columna
a
depende funcionalmente de la columnab
si el valor deb
implica un valor particular dea
. Esto generalmente significa queb
es una clave única para la tabla, ya
es alguna otra columna en esa tabla. -
Determinado únicamente por es lo mismo que la dependencia funcional.
-
La alternativa sería listar todas las columnas no agregadas en el
GROUP BY
lista:GROUP BY a.Z, a.Y, a.X
.
La razón de todo esto es que cuando selecciona columnas que no están en el GROUP BY
list, provendrán de filas arbitrarias en las filas agrupadas. Esto conduce a muchos errores comunes. Por ejemplo, un error común es escribir:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
y esperar ip_address
para contener la dirección del inicio de sesión más reciente para cada usuario. Pero en realidad contendrá cualquier de las direcciones desde las que iniciaron sesión, no la de la fila con MAX(timestamp)
. Consulte SQL Seleccionar solo filas con valor máximo en una columna
para conocer la forma correcta de hacerlo.
La excepción de dependencia funcional suele ser útil con uniones.
SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id
Desde user_id
es la clave principal de los users
tabla, determina de forma única user_name
, por lo que no es necesario enumerarlo explícitamente en GROUP BY
.