Agregación de Datos en SQL: Max, Min, Suma y Promedio
Resumen
¿Cómo se realiza la agregación de datos?
La agregación de datos es esencial para el análisis de información, ya que permite resumir volúmenes de datos mediante totales o agrupaciones relevantes para el negocio. Para lograr esta agregación, utilizamos funciones específicas dentro del lenguaje SQL estándar, el cual facilitan extraer totales y resúmenes útiles para diversos reportes e inteligencia empresarial.
¿Cómo se utiliza la función MAX?
La función MAX se emplea para identificar el valor máximo de un conjunto de datos en una tabla. Por ejemplo, si deseamos determinar el precio máximo de alquiler de una película, realizaremos la operación siguiendo pasos precisos:
SELECTMAX(rental_price)FROM movies;
En este caso, seleccionamos el precio máximo de renta de la tabla movies, que nos revela cuál es la película más cara para alquilar. Este tipo de consulta nos puede proporcionar insights sobre los precios más altos manejados en un catálogo de películas.
¿Qué significa agrupar datos en SQL?
Agrupar datos es posible mediante el uso de la cláusula GROUP BY, permitiendo generar reportes más detallados asociando las agrupaciones a un atributo específico. Supongamos que buscamos conocer el precio máximo por título de película; entonces se procesaría así:
SELECT title,MAX(rental_price)FROM movies
GROUPBY title;
Con este enfoque, se puede explorar la relación entre cada título y su precio máximo dentro de nuestra tabla.
¿Cómo se pueden calcular sumas y promedios?
La función SUM permite calcular el total, mientras que AVG obtiene un promedio. Estos son esenciales en contextos donde necesitas evaluar costos o rendimientos acumulados.
Para sumar el total de precios de alquiler de todas las películas:
SELECTSUM(rental_price)FROM movies;
Para analizar el costo promedio de alquiler de una película:
SELECTAVG(rental_price)FROM movies;
¿Qué función tiene el conteo de elementos?
COUNT es la función que te permite cuantificar cuántas ocurrencias hay de un determinado elemento. Es útil para conocer volúmenes, como cuántas películas pertenecen a una categoría específica:
SELECT classification,COUNT(*)FROM movies
GROUPBY classification;
Esto sirve para verificar cuántas películas hay disponibles en distintas clasificaciones, lo cual podría ayudar a identificar áreas del catálogo que podrían necesitar un mayor equilibrio.
¿Cuáles son las aplicabilidades de estos métodos?
Mediante estas funciones de agregación, se pueden desarrollar reportes que arrojen luz sobre diversos aspectos del negocio. Ejemplos de este tipo de insights incluyen:
Ajustes de catálogo: Saber qué categorías son populares o están faltando.
Revisión de precios: Detectar grandes disparidades en precios de alquiler.
Comportamiento de clientes: Entender cómo y cuándo se rentan y retornan las películas.
Consejo Práctico: Experimenta con otras tablas que tengas disponibles. Intenta calcular máximos, mínimos, promedios o sumas en contextos inéditos para comprender cómo puedes aplicar estos conceptos a otros conjuntos de datos. ¡Compártelo en los comentarios!
En este mundo dinámico, el dominio de técnicas de agregación de datos no solo potencia tus habilidades analíticas, sino que también te arma con las herramientas necesarias para tomar decisiones informadas en cualquier nivel de tu organización. ¡Adelante, sigue explorando!
Hay que tener en cuenta que count(*) cuenta todas la filas y count(campo) no toma encuenta los campos con valores nulos al realizar la cuenta.
BUEN DATO
Que buen hack. Gracias.
Mínimo y máximo agrupado por la clasificación de películas:
A mi juicio, en esta clase empieza el curso...
opino lo mismo, aunque estuvo bien el modulo de Que es la Ciencia de Datos, de resto, removeria los modulos anteriores, aun mas teniendo en cuenta que para ello hay una Ruta de Aprendizaje donde en cursos anteriores se ha dado eso, pero bueno, sirve para enfatizar y reforzar los conocimientos
Use el comando round() que aprendí en el curso de python, para indicar al precio promedio que solo desplegara 2 decimales
SELECT clasificacion,ROUND(AVG(precio_renta),2)AS precio_promedio
FROM peliculas
GROUPBY clasificacion
ORDERBY precio_promedio DESC;
Si tienen otra forma, compártanla !! :)
Gracias !
Empezando con la hipótesis de que en 'la ciudad donde haya más clientes, tendremos más ventas'.
Empezaría consultando clientes por ciudad.
SELECT ciudad,COUNT(cliente_id)AS n
FROM clientes AS c
INNERJOIN direcciones AS d ON c.direccion_id= d.direccion_idINNERJOIN ciudades AS ci ON d.ciudad_id= ci.ciudad_idGROUPBY ciudad
ORDERBY n DESC
Tendríamos como resultado que Londres y Aurora deberían competir para cumplir con está hipótesis
SELECT ciudad,SUM(precio_renta)AS ventas
FROM peliculas AS p
INNERJOIN inventarios AS i ON p.pelicula_id= i.pelicula_idINNERJOIN rentas AS r ON i.inventario_id= r.inventario_idINNERJOIN clientes AS c ON r.cliente_id= c.cliente_idINNERJOIN direcciones AS d ON c.direccion_id= d.direccion_idINNERJOIN ciudades AS ci ON d.ciudad_id= ci.ciudad_idGROUPBY ciudad
ORDERBY ventas DESC;
Justamente sale Aurora como ganador pero eso no aprueba nuestra hipótesis porque Londres debería estar de segundo lugar o primero pero sale como apenas sexto, entonces podríamos llegar a la conclusión que deberíamos ver cuantas películas se rentaron por ciudad y a que precio.
¿Cuáles son los países que más películas rentan? Un recorrido visual de todas las tablas que se ven implicadas para obtener esta agregación.
mi hipotesis era poder ver cuales clientes eran los que mas habian rentado este es el Query y la imagen
SELECTCONCAT(c.nombre,' ', c.apellido)AS nombre_completo,SUM(cantidad)AS pago_total
FROM clientes AS c
INNERJOIN pagos AS p
USING(cliente_id)GROUPBY cliente_id
ORDERBY pago_total DESCLIMIT10;
Jugando con la tabla peliculas_actores saqué los 5 actores que actúan en más películas
SELECT actor_id,COUNT(pelicula_id)AS peliculas_totales
FROM peliculas_actores
GROUPBY actor_id
ORDERBY peliculas_totales DESCLIMIT5
Excelente aporte... Esto es la misma consulta solo que ahora mostrando el nombre del actor.
SELECT a.nombre, pa.actor_id,COUNT(pa.pelicula_id)AS peliculas_totales
FROM actores a, peliculas_actores pa
WHERE a.actor_id= pa.actor_idGROUPBY a.nombre, pa.actor_idORDERBY peliculas_totales DESCLIMIT5;
Hola amigos. Resolví el mismo interrogante que ustedes, de otra forma y me da lo mismo que ustedes salvo en un detalle. Cuando lo hago con este código:
La actriz que actúa en más películas es Susan Davis con 54, es el único dato diferente, cosa que con su código no aparece. Me puse a mirar a detalle y es que hay dos actores_id con el mismo nombre aunque diferente id y esta sumandolos como si fuesen uno.
Queries realizados
Número de películas que están en inglés.
TOP 5 de clientes que más gastaron en renta de películas
TOP 5 clientes que más rentaron películas
TOP 5 actores que han participado en más películas
Clasificación de películas más vistas por ciudad.
Número de películas que están en inglés.
Al revisar la tabla de películas me di cuenta que todas son en ingles, ahora bien de haber películas en otros idiomas, el query seria el siguiente.
SELECTCOUNT(a.pelicula_id)AS total_peliculas_ingles, b.lenguaje_idFROM peliculas AS a
INNERJOIN lenguajes AS b ON a.lenguaje_id= b.lenguaje_idGROUPBY b.lenguaje_idHAVING b.lenguaje_id=1;
TOP 5 de clientes que más gastaron en renta de películas
SELECT cliente_id,SUM(cantidad)AS total_gastado
FROM pagos
GROUPBY cliente_id
ORDERBY total_gastado DESCLIMIT5;
4.TOP 5 actores que han participado en más películas
SELECTCONCAT(c.nombre,' ',c.apellido)AS actores,c.actor_id,COUNT(a.pelicula_id)AS total_peliculas
FROM peliculas AS a
INNERJOIN peliculas_actores AS b ON a.pelicula_id= b.pelicula_idINNERJOIN actores AS c ON b.actor_id= c.actor_idGROUPBY actores, c.actor_idORDERBY total_peliculas DESCLIMIT5;
5.Clasificación de películas más vistas por ciudad.
Debo reconocer que este ultimo query fue desafiante y divertido, logre hacer los join sin problema, una vez teniendo los datos de interés, lo que se me ocurrió, fue utilizar una Window functions, sin embargo no obtuve los datos deseados, así que termine apoyándome con el código del compañero Alejandro Jose Ysea Gonzalez.
SELECT ciudad, clasificacion
FROM(SELECT ciudad, clasificacion,count(renta_id)AS cantidad_rentada,rank()over(partition By ciudad order by count(*) desc)as ranking_ciudad
FROM(SELECT f.ciudad, d.cliente_id, c.renta_id, a.pelicula_id, a.clasificacionFROM peliculas AS a
INNERJOIN inventarios AS b ON a.pelicula_id= b.pelicula_idINNERJOIN rentas AS c ON b.inventario_id= c.inventario_idINNERJOIN clientes AS d ON c.cliente_id= d.cliente_idINNERJOIN direcciones AS e ON d.direccion_id= e.direccion_idINNERJOIN ciudades AS f ON e.ciudad_id= f.ciudad_id)as tabla_renta_por_ciudad
GROUPBY ciudad, clasificacion
ORDER by cantidad_rentada DESC)ASTabla_finalWHERE ranking_ciudad =1;
1) Cantidad de películas en ingles```txt
SELECT COUNT(*)
FROM (
SELECT p.titulo, p.lenguaje_id, l.nombre AS lenguaje
FROM peliculas AS p
LEFT JOIN lenguajes AS l
ON p.lenguaje_id = l.lenguaje_id
) AS cuenta_peliculas_ingles
WHERE lenguaje = 'English';
```js
SELECT c.cliente_id, CONCAT(c.nombre, ' ', c.apellido) as cliente, SUM(p.cantidad) AS pagado_cliente
FROM clientes AS c
INNER JOIN pagos AS p
ON c.cliente_id = p.cliente_id
GROUP BY c.cliente_id
ORDER BY pagado_cliente DESC
LIMIT 5;
```3) Clientes que mas rentaron películas
```js
SELECT c.cliente_id, CONCAT(c.nombre, ' ', c.apellido), COUNT(*) AS cantidad_peliculas_rentadas FROM clientes AS c
INNER JOIN rentas AS r
ON c.cliente_id = r.cliente_id
GROUP BY c.cliente_id
ORDER BY cantidad_peliculas_rentadas DESC
LIMIT 5;
```4) Actores que han participado en mas películas
```js
SELECT a.actor_id, CONCAT(a.nombre, ' ', a.apellido), COUNT(a.actor_id) AS apariciones
FROM peliculas_actores AS pa
INNER JOIN actores AS a
ON pa.actor_id = a.actor_id
GROUP BY a.actor_id
ORDER BY apariciones DESC
LIMIT 5;
```5) Clasificación de películas mas vistas por ciudad
```txt
SELECT ciudad, clasificacion, total FROM(
SELECT city.ciudad, p.clasificacion, COUNT(*) AS total,
RANK() OVER(PARTITION BY ciudad ORDER BY COUNT(*) DESC)
FROM clientes AS c
INNER JOIN direcciones AS d
ON c.direccion_id = d.direccion_id
INNER JOIN ciudades AS city
ON d.ciudad_id = city.ciudad_id
INNER JOIN rentas AS r
ON c.cliente_id = r.cliente_id
INNER JOIN inventarios AS inv
ON r.inventario_id = inv.inventario_id
INNER JOIN peliculas AS p
ON inv.pelicula_id = p.pelicula_id
GROUP BY city.ciudad, p.clasificacion
ORDER BY total DESC
) AS lastt
WHERE RANK = 1;
```En el 5 me copie del RANK que ya habían usado, casi no me sale.
Para ver el total de películas en cada idioma.
SELECT l.nombre,COUNT(p.titulo)AS"Numero_Peliculas"FROM lenguajes AS l
FULLOUTERJOIN peliculas AS p
ON l.lenguaje_id= p.lenguaje_idGROUPBY l.nombre
Hola Javier, al revisar la BD me di cuenta que todas las películas están en inglés (id=1). Suponiendo que hay películas en varios idiomas el query quedaría así:
SELECT l.nombre AS idioma, COUNT(p.titulo) AS total_peliculas
FROM lenguajes AS l
INNER JOIN peliculas AS p
ON l.lenguaje_id = p.lenguaje_id
GROUP BY idioma;
Hice este query para saber cuantas rentas distintas se hicieron por mes.
SELECTdate_trunc('month', fecha_renta)as mes,count(distinct(renta_id))AS numero_rentas
FROM rentas
GROUPBY mes
ORDERBY numero_rentas DESC;
Asi ordene las peliculas por el minimo
select titulo,min(precio_renta)from peliculas
group by titulo
order by min(precio_renta);
Practique con algunos queries y esto pude sacar, algo que deberia mejorar guys?
---Minimo y maximo precio de renta por clasificacion
SELECT clasificacion,MIN(precio_renta)ASMin_precio_renta,MAX(precio_renta)ASMax_precio_rentaFROM peliculas
GROUPBY clasificacion;---Precio promedio de renta por clasificacion
SELECT clasificacion,ROUND(AVG(precio_renta),2)AS avg_renta
FROM peliculas
GROUPBY clasificacion
ORDERBY avg_renta DESC;--Duracion promedio de renta por clasficacion
SELECT clasificacion,ROUND(AVG(duracion_renta),2)AS temps_renta
FROM peliculas
GROUPBY clasificacion
ORDERBY temps_renta;---duracion pomedio(hour) por clasificacion
SELECT clasificacion,ROUND(AVG(duracion)/60,2)AS duracion_por_clasificacion_hour
FROM peliculas
GROUPBY clasificacion
ORDERBY duracion_por_clasificacion_hour;--Duracion promedio de pelicula(minutos) por clasificacion
SELECT clasificacion,ROUND(AVG(duracion),2)AS duracion_por_clasificacion
FROM peliculas
GROUPBY clasificacion
ORDERBY duracion_por_clasificacion;--Costo promedio de remplazo por titulo TOP53SELECT titulo,ROUND(AVG(costo_reemplazo),2)AS replacement_cost
FROM peliculas
GROUPBY titulo
ORDERBY replacement_cost DESCLIMIT53;---Costo promedio de reemplazo por clasificacion
SELECT clasificacion,ROUND(AVG(costo_reemplazo),2)AS replacement_cost
FROM peliculas
GROUPBY clasificacion
ORDERBY replacement_cost DESC;---Mayor duracion de renta por titulo
SELECT titulo,MAX(duracion_renta)ASMax_duracion_rentaFROM peliculas
GROUPBY titulo
ORDERBYMax_duracion_rentaDESC;--DuracionMax y Min de renta por clasificacion
SELECT clasificacion,MAX(duracion_renta)ASMax_duracion_renta,MIN(duracion_renta)ASMin_duracion_rentaFROM peliculas
GROUPBY clasificacion;---total de peliculas por clasificacion
SELECT clasificacion,COUNT(*)AS total_movies_per_clasificacion
FROM peliculas
GROUPBY clasificacion
ORDERBY total_movies_per_clasificacion DESC;
Curioso no sabia que se podían hacer graficas
En todos los casos el precio menor por clasificacion es de $0.98
SELECT clasificacion,MIN(precio_renta)AS precio_renta_menor
FROM peliculas
GROUPBY clasificacion
ORDERBY precio_renta_menor DESC
La agregación de datos generalmente funciona en grandes bases de datos que no proporcionan mucho valor de información por sí solos. Los procesos clave de la agregación de datos son la recopilación, utilización y presentación de datos que están disponibles y presentes globalmente.
Se me ocurrio mirar cual era el empleado que mas ventas concretaba y me termine dando cuenta de que hay que echar a Dave, Erika y Edna, ya que no concretaron ninguna jaja.
Esta fue la query que utilice !
SELECT empleados.nombre, empleados.apellido, SUM(pagos.cantidad) AS total_ventas
FROM empleados
LEFT JOIN pagos
ON empleados.empleado_id = pagos.empleado_id
GROUP BY empleados.nombre, empleados.apellido
ORDER BY total_ventas DESC;
Mi Query: Clasificacion de Pelis favorita por Ciudad
SELECT ciudad, clasificacion
FROM(SELECT ciudad, clasificacion,count(renta_id)AS cantidad_rentada,rank()over(partition By ciudad order by count(*) desc)as ranking_ciudad
FROM(SELECT ci.ciudad, pe.titulo, pe.duracion, pe.clasificacion, r.renta_idFROMpublic.peliculasAS pe
INNERJOINpublic.inventariosAS i ON pe.pelicula_id= i.pelicula_idINNERJOINpublic.rentasAS r ON i.inventario_id= r.inventario_idINNERJOINpublic.clientesAS c ON r.cliente_id= c.cliente_idINNERJOINpublic.direccionesAS d ON c.direccion_id= d.direccion_idINNERJOINpublic.ciudadesAS ci ON d.ciudad_id= ci.ciudad_id)asTabla_renta_por_ciudadGROUPBY ciudad, clasificacion
ORDER by cantidad_rentada DESC)ASTabla_finalWHERE ranking_ciudad =1;
NOTA: Si puedes simplificarlo me enseñas como?
Hola Alejandro, así obtuve mi resultado aunque siento que muy bajas las cifras. Que en una ciudad sólo tres personas hayan visto una pelicula? Claro está que el número de ciudades es muy alta.
![](
Ya está Alejandro, al código anterior le quito la columna titulo y me salen tus mismas respuestas. Decide tu mismo si el código es más fácil o no.
Pensé que podría ser útil saber cuantos empleados hay por tienda, para saber así qué tienda tiene más empleados y qué además están activos. El query sería así: