Duda SQL

M

Buenas,

Tengo una duda con un ejercicio de SQL que no acabo de encontrar la solución. El problema viene a decir lo siguiente:

"Mostrar los nombres de las series de la plataforma "Netflix" que tengan una calificación igual o superior a la media de las calificaciones de las series de la plataforma "Netflix"."

Yo he llegado a mostrar la serie que tiene más media de todas con:

SELECT nombre, AVG(calificación)
FROM SERIE
WHERE plataforma = "Netflix";
GROUP BY nombre
HAVING AVG(calificación) = (SELECT MAX(AVG(calificación) FROM SERIE GROUP BY nom)

Pero no sé cómo mostrar las que tienen más media con respecto a la media total.

Por ejemplo:

Si tengo 4 películas con una media de (8, 3, 5, 9) y la media de las tres series es (6,25), quiero que se me muestren el nombre de las películas con la media (8 y 9)

Gracias

Tharkisis

HAVING AVG(calificación) > 5 FROM SERIE GROUP BY nom)
Puede ser así?

Dededede

En el having tendrás que comprobar que la calificación es mayor que la media de calificaciones.

En el select no tiene sentido que muestres el average por cierto.

1 respuesta
M

#3

HAVING AVG(calificación) >= (SELECT MAX(AVG(calificación) FROM SERIE GROUP BY nom)

Es así?

1 respuesta
Fyn4r

Pero esa que tienes la has escrito tu y la entiendes?

1 respuesta
M

#5 Claro que la entiendo por eso la he escrito yo.

Simplemente no entiendo como hacer una comparativa total de cada calificacion con la media total. Pero he visto que es possible haciendo lo siguiente:

HAVING AVG(calificación) >= (SELECT MAX(AVG(calificación) FROM SERIE GROUP BY nom)

No?

Estoy empezando, por eso tenga esas dudas.

1 respuesta
Dededede

#4 Hace años que no toco SQL, pero creo que seria algo asi.

HAVING calificacion > AVG(calificacion)

Es posible que haga fatal un sub select para sacar ese avg, pero piilas la idea no?

1 respuesta
cabron

https://www.w3resource.com/sql-exercises/subqueries/sql-subqueries-inventory-exercise-4.php

aquí lo tienes explicado

1 respuesta
M

#7 Genial, si!
#8 Muchas gracias!

Fyn4r

#6 entonces que pinta ese max ahí?

1 respuesta
M

#10 No pinta nada, losé. Simplemente era para mostrar hasta donde havia llegado.

De momento tengo esto:

SELECT nom
FROM SERIE
WHERE plataforma = "Netflix";
GROUP BY nom
HAVING qualificacio >= AVG(qualificacio)

Voy a ver si funciona.

2 respuestas
thecaballero

#11 Puedes hacer una subquery por qualificacio >= (Select avg...)

1
Jaichi

#11 Estoy aprendiendo SQL yo también, pero no sería algo así?

SELECT nombre, calificacion
FROM serie
WHERE plataforma="Netflix"
AND calificacion >= (SELECT AVG(calificacion) FROM serie

1 respuesta
thecaballero

#13 te faltaría el join de plataforma en la subquery o estarías sacando la media de todas las plataformas

1 2 respuestas
Jaichi

#14 Con la emoción de entender las subconsultas olvidé que en el enunciado de #1 pone bien clarito que también está esa condición en la subconsulta jajaja.

Gracias por el aviso, que a veces soy un poco desastre para fijarme en estas cosas.

1 respuesta
M

#14 #15 Pero en el where ya ponemos que solo salga la cualificación por encima de todas las medias, no?

No entiendo lo del subqueri plataforma

1 respuesta
Jaichi

#16 Que en la consulta que puse antes en #13 tienes que poner en la subconsulta la misma condición serie="Netflix" porque si no la subconsulta saca la media de todas las series, y tu enunciado pide que sean superiores a la media de series de Netflix.

Y en el where de la consulta principal es porque quieres mostrar las series de Netflix, si no estarías mostrando todas las series que tienen media superior a la de Netflix independientemente de la plataforma a la que pertenecen.

SELECT nombre, calificacion
FROM serie
WHERE plataforma="Netflix"
AND calificacion >= (SELECT AVG(calificacion) FROM serie WHERE plataforma="Netflix");

2 respuestas
M

#17 Ah vale.....Ahora lo entiendo!

Vandalus

yo tambien estoy en proceso de aprender y por ahora voy a resultado si va bien y si no pues repaso el codigo y voy probando.

Creo que algo asi,

SELECT nombre
FROM SERIE
WHERE plataforma = 'Netflix' AND calificacion >= (select avg(calificacion) from serie);
thecaballero

#17 Debería de ser más bien

SELECT nombre, calificacion
FROM serie a
WHERE a.plataforma="Netflix"
AND a.calificacion >= (SELECT AVG(b.calificacion) FROM serie b WHERE b.plataforma = a.plataforma);

Funcionaría igual, pero meter dos veces los literales meh

1 1 respuesta
Jaichi

#20 Oye pues muchas gracias por compartir esto, la verdad que así queda mucho mejor.

Me alegro de haber posteado aquí y aprender algo nuevo yo también ☺️

3
B

Se entiende que esta tabla podría procesar muchos datos... ¿merece la pena mostrarlos actualizados? Por sacarle punta al ejercicio podrías usa "materialized view" (lo que vienen siendo 'snapshots') y actualizar la tabla todas las noches.... Así aceleras las consulta de los datos. Pero lo dicho, sabiendo que no se mostraran actualizados con lo ultimisimo.

M

Aprovecho este hilo para preguntar una duda:

Tengo que sacar las series que todavia no han terminado. Es decir, tengo dos bases de datos:

A: nombres de series, temporadas previstas
B: plataformas y temporadas que lleva.

Necesito sacar el nombre de las series que todavia no han terminado.

Lo idel seria restar la columna de temporadas previstas con la de temporadas, preo creo que en sql no hay resta como tal, no?

1 respuesta
MTX_Anubis

#23 Pues claro que hay resta y si no hubiera, una resta no es más que una suma negativa. Por otro lado, más que restar lo que deberías ver es que las temporadas emitidas sean menores que las previstas.

Vamos que con SQL casi siempre puedes escribir las cosas tal como las piensas (es lo que tienen los lenguajes declarativos) así que piensa un poco como lo harías.

1 respuesta
M

#24 grcias por el consejo

Usuarios habituales