-- El minimo (solo nombre)
SELECT MIN(nombre)
FROM alumnos;
-- El minimo por id de tutor ordenados por ID
SELECT tutor_id,MIN(nombre)
FROM alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Introducción a SQL
Breve historia de SQL
Álgebra relacional
Instalación de la BD de ejemplo
Qué es una proyección (SELECT)
Origen (FROM)
Productos cartesianos (JOIN)
Selección (WHERE)
Ordenamiento (ORDER BY)
Agregación y limitantes (GROUP BY y LIMIT)
Ejercitando tu SQL
El primero
El segundo más alto
Seleccionar de un set de opciones
En mis tiempos
Seleccionar por año
Duplicados
Selectores de rango
Eres lo máximo
Egoísta (selfish)
Resolviendo diferencias
Todas las uniones
Triangulando
Generando rangos
Regularizando expresiones
Conceptos de SQL Avanzado
Bases de datos distribuidas
Queries distribuídos
Sharding
Window functions
Particiones y agregación
El futuro de SQL
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Israel Vázquez Morales
Aportes 230
Preguntas 3
-- El minimo (solo nombre)
SELECT MIN(nombre)
FROM alumnos;
-- El minimo por id de tutor ordenados por ID
SELECT tutor_id,MIN(nombre)
FROM alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Una versión para MySQL SIN utilizar las window function, en una ocasion me toco trabajar con una BD DB2 y había que ingeniarse siempre como hacerlo todo con Select y Sub Selects. Por si a alguien le sirve, es otra perspectiva mismo resultado.
SELECT
CONCAT( '[', MAX(A.carrera_id), ' - ', MIN(A.carrera_id), ']' ) AS Rango_Id_Interseccion
FROM (
SELECT
carrera_id
FROM platzi.alumnos
WHERE carrera_id IN (
SELECT tutor_id FROM platzi.alumnos GROUP BY tutor_id
)
GROUP BY carrera_id
) AS A
El reto se puede hacer con menos líneas de código y más directo sin subquerys así:
SELECT numrange(MIN(tutor_id),MAX(tutor_id)) * numrange(MIN(carrera_id),MAX(carrera_id))
FROM platzi.alumnos;
Mi reto:
SELECT MIN(nombre)
FROM platzi.alumnos
GROUP BY nombre
ORDER BY nombre DESC
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id DESC;```
Mi respuesta
--minimo nombre de alumnos
SELECT MIN(nombre)
FROM platzi.alumnos;
--minimo nombre con id de tutor
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id;
Hola adicionalmente al reto platzi, me tomé el siguiente reto personal:
/* Reto Personal: El estudiante que se matriculó de ultimo en cada carrera*/
SELECT *
FROM(
SELECT DISTINCT MAX(fecha_incorporacion) as t, carrera_id
FROM platzi.alumnos AS a1
GROUP BY carrera_id
) AS seleccion
INNER JOIN platzi.alumnos
ON seleccion.t = fecha_incorporacion
ORDER BY alumnos.carrera_id;
SELECT fecha_incorporacion
FROM platzi.alumnos
ORDER BY fecha_incorporacion DESC
LIMIT 1;
SELECT carrera_id,
MAX(fecha_incorporacion)
FROM platzi.alumnos
GROUP BY carrera_id
ORDER BY carrera_id;
-- RETO
SELECT MIN(nombre) AS nombre_minimo
FROM platzi.alumnos;
SELECT MIN(nombre) AS nombre_minimo, tutor_id
FROM platzi.alumnos
GROUP BY tutor_id;
Estaba intentando cumplir el reto y me desvie, termine buscando las filas que contenian el mismo nombre y el mismo tutor_id, les dejo la query quiza a alguien le parece interesante o encuentra una mejor manera de realizarla!
SELECT nombre, tutor_id, id
FROM platzi.alumnos
WHERE id IN(
SELECT id FROM(
SELECT id, ROW_NUMBER() OVER(
PARTITION BY
nombre,
tutor_id
ORDER BY nombre ASC) AS row
FROM platzi.alumnos) AS id_duplicates
WHERE row > 1)
ORDER BY nombre, tutor_id, id;
--El minimo nombre que existe en nuestra tabla
SELECT MIN(nombre) AS nombre_alumnos
FROM platzi.alumnos;
-- El minimo por id de tutor ordenados
SELECT tutor_id AS tutor,MIN(nombre) AS nombre_alumno
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Desafío:
-- Reto: extraer el minimo nombre, alfabeticamente, que existe en nuestra tabla
-- de toda la tabla y el minimo por id de tutor
-- Nombre mínimo alfabeticamente hablando
SELECT nombre
FROM platzi.alumnos
ORDER BY nombre
LIMIT 1;
-- Nombre mínimo alfabeticamente hablando por tutor_id
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Mis respuestas:
SELECT tutor_id, nombre
FROM platzi.alumnos
GROUP BY tutor_id, nombre
ORDER BY nombre DESC;
SELECT tutor_id, MAX(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
/* Minimo nombre de toda la tabla */
SELECT min(nombre) FROM alumnos
/* Minimo por id de tutor */
SELECT tutor_id, min(nombre)
FROM alumnos
GROUP BY tutor_id
ORDER BY tutor_id
Mi solución 😃
SELECT int4range(minimo_id, maximo_id) * int4range(min_tutor, max_tutor)
FROM (
SELECT min(id) as minimo_id, max(id) as maximo_id, min(tutor_id) as min_tutor, max(tutor_id) as max_tutor
FROM platzi.alumnos
) as min_max
MI reto
SELECT nombre
FROM platzi.alumnos
ORDER BY nombre
;```
# .-2
```SELECT min(nombre),tutor_id
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id
;
SELECT
tutor_id,
MAX(carrera_id) - MIN(carrera_id) AS diferencia_carrera_id,
MAX(tutor_id) - MIN(tutor_id) AS diferencia_tutor_id
FROM platzi.alumnos
GROUP BY tutor_id;
MAX(carrera_id) - MIN(carrera_id) calcula la diferencia entre el valor máximo y mínimo de carrera_id para cada grupo de tutor_id.
MAX(tutor_id) - MIN(tutor_id) calcula la diferencia entre el valor máximo y mínimo de tutor_id para cada grupo de tutor_id.
-- Ejercicio 8 / Treatraer el minimo nombre alfabeticamente de toda la tabla y el minimo nombre agrupado por tutor id
-- Traigo el minimo nombre alfabeticamente de toda la tabla de alumnos
SELECT MIN(nombre) AS menor_nombre
FROM platzi.alumnos
-- Traigo el minimo nombre alfabeticamente agrupado por tutor id
SELECT MIN(nombre) AS menor_nombre_por_tutor
FROM platzi.alumnos
GROUP BY tutor_id;
PARA EL MAXIMO NOMBRE
SELECT tutor_id, max(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id ;
Mi solución ordenando por nombre para identificar cual es el MÍNIMO nombre
-- Máximo absoluto de la tabla --
SELECT fecha_incorporacion
FROM platzi.alumnos
ORDER BY fecha_incorporacion DESC
LIMIT 1;
-- Intento por GROUP BY --
SELECT carrera_id, fecha_incorporacion
FROM platzi.alumnos
GROUP BY carrera_id, fecha_incorporacion
ORDER BY fecha_incorporacion DESC;
-- Funcion MAX --
SELECT carrera_id, MAX(fecha_incorporacion)
FROM platzi.alumnos
GROUP BY carrera_id
ORDER BY carrera_id;
Esto me ayudo a entender. Aquí se ve claramente que Wanda tiene el tutor_id 9 y si miran en la segunda consulta se ve que Terencio es el alumno que tiene el id 9
Mi solución:
select tutor_id, min(nombre)
from platzi.alumnos
group by tutor_id
order by tutor_id
Esta seria mi solución al reto
-- El mínimo por nombre
SELECT MIN (nombre)
FROM platzi.alumnos
-- El mínimo, ordenado por id de tutor
SELECT tutor_id,
MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
<SELECT
int4range(
MIN (carrera_id),
MAX(carrera_id)) *
int4range(
MIN (tutor_id),
MAX(tutor_id))
FROM platzi.alumnos>
RETO: traer datos cuando el tutor_id y carrera_id sea entre 1,3
SELECT * FROM platzi.alumnos
WHERE (tutor_id BETWEEN 1 AND 3) AND (carrera_id BETWEEN 1 AND 3);
El mas facil hasta ahora 😃
(por lo menos para mi)
select min(nombre), tutor_id
from platzi.alumnos
group by tutor_id
order by tutor_id desc;
Mi solución
El mínimo nombre por orden alfabético de toda la tabla
SELECT nombre
FROM platzi.alumnos
ORDER BY nombre ASC
LIMIT 1;
El mínimo nombre por tutor_id
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
/* Mímino del nombre de toda la tabla*/
SELECT MIN(nombre)
FROM platzi.alumnos
GROUP BY nombre
ORDER BY nombre
LIMIT 1;
/* Mímino del nombre por id del tutor*/
SELECT tutor_id, nombre
FROM platzi.alumnos
GROUP BY tutor_id, nombre
ORDER BY tutor_id, MIN (nombre);
El mínimo nombre alfabeticamente de toda la tabla y el mínimo por cada id de tutor
--el mínimo por cada id de tutor--
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
--mínimo nombre alfabeticamente de toda la tabla--
SELECT MIN(nombre)
FROM platzi.alumnos;
Solución a los retos:
–Tarea: mínimo nombre alfabeticamente que existe en nuestra tabla por tutor_id
–Mínimo de toda la tabla
SELECT MIN(nombre)
FROM platzi.alumnos
–Mínimo nombre por id_tutor
SELECT tutor_id, MIN(nombre) AS nombre
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id ASC;
--Nombre minimo alfabeticamente de toda la tabla
SELECT MIN(LOWER(nombre))
FROM platzi.alumnos
--Nombre minimo alfabetico agrupado por ID de tutor
SELECT tutor_id, MIN(LOWER(nombre)) AS nombre_minimo
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id
Reto: sacar el minimo nombre que aparece en la tabla (primero sacar el minimo de toda la tabla y luego hacer le minimo por id de tutor
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id ASC;
SELECT nombre
FROM platzi.alumnos
ORDER BY nombre ASC
LIMIT 1;
SELECT MIN(nombre)
FROM platzi.alumnos;
SELECT tutor_id, MIN(nombre) AS min_nombre_alumno
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
--Reto- sacar el mínimo nombre (ordenado alfabéticamente) con los dos métodos
--Limit
SELECT nombre FROM platzi.alumnos
ORDER BY nombre ASC
LIMIT 1;
--MIN por id de tutor
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY MIN (nombre);
Mi aporte
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Resolución del reto:
Mínimo nombre por orden alfabético:
SELECT MIN (nombre)
FROM platzi.alumnos;
Mínimo por id tutor:
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
mi solucion:
select
INT4RANGE(MIN(carrera_id),MAX(carrera_id))
*
INT4RANGE(MIN(tutor_id),MAX(tutor_id))
FROM PLATZI.ALUMNOS
mi aporte al reto:
--- minimo nombre alfabeticamente (reto)
SELECT MIN (Nombre)
FROM curso.alumnos
GROUP BY nombre
ORDER BY nombre DESC
Limit 1;
--- minimo nombre alfabeticamente por tutor (reto)
SELECT tutor_id, MIN(nombre)
FROM curso.alumnos
GROUP BY tutor_id, nombre
ORDER BY tutor_id DESC
–SACAR EL MINIMO DE TODA LA TABLA
SELECT MIN (nombre) AS minimo_tabla
FROM platzi.alumnos;
–MINIMOS POR TUTOR_ID
SELECT tutor_id, MIN(nombre) AS minimo_nombre
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Otra forma de hacer el ejercicio visto en clase es con la función de venta sql
SELECT carrera_id,fecha_incorporacion
FROM (
SELECT
ROW_NUMBER() OVER(
PARTITION BY
carrera_id
ORDER BY fecha_incorporacion DESC
) AS row,
*
FROM platzi.alumnos
) AS ca
WHERE ca.row = 1
ORDER BY carrera_id, fecha_incorporacion DESC;
SELECT MIN(nombre) AS min_nombre_global
FROM platzi.alumnos;
SELECT tutor_id, MIN(nombre) AS min_nombre_por_tutor
FROM platzi.alumnos
GROUP BY tutor_id;
SELECT MIN(nombre)
FROM platzi.alumnos;
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id;
Mi solucion:
SELECT nombre
FROM platzi.alumnos
ORDER BY fecha_incorporacion ASC
LIMIT 1;
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id;
SELECT nombre
from platzi.alumnos
ORDER BY nombre DESC
LIMIT 1;
SELECT tutor_id, MAX(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id
Hola! corregí mi código
SELECT tutor_id, MIN (nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Hola! así quedó mi partcipación
SELECT MIN (nombre)
FROM platzi.alumnos;
SELECT nombre
FROM platzi.alumnos
GROUP BY nombre
ORDER BY nombre DESC;
SELECT carrera_id, MIN (nombre)
FROM platzi.alumnos
GROUP BY carrera_id
ORDER BY carrera_id;
Mi solución al reto de esta clase:
SELECT MIN(nombre)
FROM platzi.alumnos;
SELECT nombre, MIN(nombre)
FROM platzi.alumnos
GROUP BY nombre
ORDER BY nombre;
Mi respuesta. Para el primer caso, lo hice de dos formas:
--sacar minimo nombre alfabeticamente de toda la tabla
select nombre from platzi.alumnos
order by nombre asc
Limit 1;
select min(nombre) from platzi.alumnos;
Para el segundo caso, hice una simple (como lo enseñó el profe en el vídeo):
select min(nombre), tutor_id
from platzi.alumnos
group by tutor_id
order by tutor_id;
y otra un poco más complicada usando window function:
select * from (
select tutor_id, nombre,
row_number() over(partition by tutor_id order by nombre asc) as row_num
from platzi.alumnos
) as nombre_by_tutorid where row_num=1
SELECT fecha_incorporacion, tutor_id
FROM platzi.alumnos
GROUP BY tutor_id, fecha_incorporacion
ORDER BY fecha_incorporacion DESC;
SELECT tutor_id, MIN (fecha_incorporacion)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
me siento re frustrado, creo que se deberian explicar mejor estas nuevas consultas. Trate de tomar el rango devuelto para usarlo en otra consulta y me salen un millon de errores.
select tutor_id, MIN(nombre)
from platzi.alumnos
group by tutor_id
order by tutor_id;
select *
from platzi.alumnos
order by nombre asc
limit 1;
group by
limit 1;
Nombre mas corto
SELECT MIN(nombre)
FROM platzi.alumnos
Nombre mas corto por tutor
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
--el minimo solo nombre
SELECT MIN(nombre)
FROM platzi.alumnos;
-- el minimo por id de tutor
SELECT tutor_id, min(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Esta fue mi solucion
Mi respuesta
select tutor_id, min(nombre) from alumnos
group by tutor_id
order by tutor_id;
Reto
SELECT tutor_id, min(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id DESC;
La solucion del reto
SELECT MIN (nombre)
FROM platzi.alumnos
GROUP BY nombre
ORDER BY nombre;
SELECT tutor_id, MIN (nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
RETO
Mínimo de toda la tabla (nombre)
SELECT MIN(nombre)
FROM platzi.alumnos;
Mínimo nombre agrupado con tutor_id
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id ASC
Aquí mi respuesta del reto de la clase:
SELECT nombre
FROM platzi.alumnos
ORDER BY nombre ASC
LIMIT 1;
<---------------------------------------->
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
--Solución para obtener el minimo nombre alfabeticamente en nuestra tabla.
--FORMA 1 :
SELECT nombre FROM platzi.alumnos
ORDER BY nombre
LIMIT 1;
--FORMA 2:
SELECT MIN(nombre)
FROM platzi.alumnos;
--Solución para obtener el minimo por id_tutor
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
El reto Resuelto en SQL Server:
– Con select top –
SELECT TOP 1 nombre
FROM alumnos
ORDER BY nombre ASC
– Con min –
SELECT MIN (nombre) as nombre FROM alumnos
– Por id de tutor –
SELECT tutor_id, MAX(nombre)
FROM alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
SELECT nombre
FROM platzi.alumnos
ORDER BY nombre;
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id
SELECT tutor_id, MIN(nombre)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id ASC;
SELECT tutor_id, MIN (fecha_incorporacion)
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
segunda alternativa
SELECT tutor_id, MIN (nombre)
FROM platzi.alumnos
GROUP BY tutor_id, nombre
ORDER BY tutor_id;
Mi respuesta al reto:
-- Min nombre en toda la tabla
SELECT MIN(nombre)
FROM platzi.alumnos;
-- Min nombre por tutor
SELECT MIN(nombre), tutor_id
FROM platzi.alumnos
GROUP BY tutor_id
ORDER BY tutor_id;
Hola, entendí que la tarea era traer todos los campos en común, así que este fue mi Query:
NOTA: Antes de realizar esto, verificar los rangos de cada una de las columnas, ya que pueden caer en el rango más amplio (en este caso el de “carrera_id” que es de 1 a 50) y traer lo que este contenga respecto al rango a comparar, en el caso de “tutor_id” que es de 1 a 30, entonces nos seguiría trayendo todos los datos de la tabla sin más.
SELECT *
FROM PLATZI.ALUMNOS
WHERE INT4RANGE((SELECT MIN(TUTOR_ID) FROM PLATZI.ALUMNOS),
(SELECT MAX(TUTOR_ID) FROM PLATZI.ALUMNOS))
@> CARRERA_ID;
¡Hola! Yo lo resolví así:
SELECT rango_carreras * rango_tutores
FROM (
SELECT int4range(MIN(carrera_id), MAX(carrera_id)) AS rango_carreras,
int4range(MIN(tutor_id), MAX(tutor_id)) AS rango_tutores
FROM platzi.alumnos
) AS un_alias_requerido;
Creo que es bastante parecido a lo que propone Israel.
Solución reto de la anterior clase:
SELECT
(CONCAT('[',MIN(id)::text, ',',(MAX(id))::text,']'))::int4range
*
(CONCAT('[',MIN(tutor_id)::text, ',',(MAX(tutor_id))::text,']'))::int4range
AS overlap_tutor_id
FROM platzi.alumnos;
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?