SQL - Calcular el valor máximo de un promedio.

 
Vista:

Calcular el valor máximo de un promedio.

Publicado por Pablo (7 intervenciones) el 31/03/2021 13:52:06
Estimados,

Tengo un pequeño problema con unas consultas anidadas.

Tengo una tabla con alumno_id, practica_id y nota_practica.

Cada alumno realiza un número diferente de practicas, por lo que calculo la nota media agrupando por alumno.

Si hago un
1
2
3
SELECT alumno_id, AVG(nota_practica) as 'Nota Media'
FROM practicas
GROUP BY alumno_id ORDER BY 'Nota Media' DESC

Me sale un listado de alumnos con sus notas medias ordenados de mayor a menor. Perfecto.

Ahora bien, quiero sacar el id de los alumnos y (su nota media) que han obtenido la mayor nota media (dos en mi caso) y no hay manera.

Entiendo que ésta consulta debe ir como condición WHERE, y que además sea MAX, pero no lo consigo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 70
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Calcular el valor máximo de un promedio.

Publicado por joel (25 intervenciones) el 31/03/2021 16:30:49
Hola Pablo, que motor de base de datos estas utilizando?

Según entiendo quieres mostrar todos los que la nota media es superior a 2, no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular el valor máximo de un promedio.

Publicado por Pablo (7 intervenciones) el 01/04/2021 00:04:19
Gracias Joel por tu respuesta.

Estoy usando MariaDB 10 (con Xampp en modo local)

La nota media de los alumnos que más nota han sacado es 9, y ellos son dos alumnos.

El resultado de mi consulta debería dar dos registros.

Entiendo que la consulta

1
2
3
SELECT alumno_id, AVG(nota_practica) as 'Nota Media'
FROM practicas
GROUP BY alumno_id ORDER BY 'Nota Media' DESC

debe ser la condición WHERE de mi consulta principal.

Te incluyo el código sql con 5 alumnos y 5 prácticas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
create table practicas(
	alumno_id int,
	practica_id int,
	nota_practica decimal(5,2)
);
 
insert into practicas(alumno_id,practica_id,nota_practica) values
(1,1,7),
(1,2,8),
(1,3,9),
(1,4,9),
(1,5,10),
(2,1,6),
(2,2,7),
(2,3,10),
(2,4,5),
(2,5,8),
(3,1,7),
(3,2,7),
(3,3,6),
(3,4,8),
(3,5,5),
(4,1,9),
(4,2,8),
(4,3,5),
(4,4,10),
(4,5,8),
(5,1,9),
(5,2,10),
(5,3,8),
(5,4,7),
(5,5,9);

Según mis cálculos el alumno 1 y el 5 tienen las medias más altas y éstas son de 8,6 puntos.

Gracias por tu respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular el valor máximo de un promedio.

Publicado por Pablo (7 intervenciones) el 01/04/2021 13:01:28
Creando una vista previa, dónde pueda calcular los promedios de cada alumno y realizando una consulta sobre esa vista que me devuelva el máximo de esos promedios, si obtengo lo que busco.

Es una solución que serviría para el mundo de la empresa, pero que no me resuelve el problema desde el punto de vista académico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular el valor máximo de un promedio. (SOLUCIONADO)

Publicado por Pablo (7 intervenciones) el 03/04/2021 18:30:06
Encontré la solución y la expreso aquí para su posterior consulta.

Si hago una vista con las notas medias agrupadas por alumno y luego puedo consultar esa vista para extraer quien (o quienes) son los alumnos que obtuvieron la nota máxima, también podré usar el código de esa vista como si fuera una tabla virtual y hacer lo mismo.

Es largo y tedioso, pero para un curso de MySQL en el que no se han explicado las vistas da el resultado que se busca.

1
2
3
4
5
6
7
8
9
SELECT alumno_id, nota FROM
(SELECT `alumno_id`, AVG(`nota_practica`) as nota
FROM alumnos_por_practicas as t1
GROUP BY alumno_id) as t2
WHERE nota = (SELECT MAX(nota)
              FROM (SELECT `alumno_id`, AVG(`nota_practica`) as nota
					FROM alumnos_por_practicas
					GROUP BY alumno_id) AS t2
             		)

Y lo mismo para el mínimo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar