Solucion del reto
SELECT INT4RANGE(MIN(tutor_id), MAX(tutor_id)) * INT4RANGE(MIN(carrera_id), MAX(carrera_id))
FROM platzi.alumnos;
Solucion del reto
SELECT INT4RANGE(MIN(tutor_id), MAX(tutor_id)) * INT4RANGE(MIN(carrera_id), MAX(carrera_id))
FROM platzi.alumnos;
Como cuando crees que dominas Postgres y aparece esto. :O
En SQL Server
-- CREAR UN RANGO DE VALORES [9; 11]
SELECT TOP 11
9 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range'
FROM syscolumns A, syscolumns B
-- UNION DE 2 RANGOS
(
SELECT TOP 9 -- [11; 19]
10 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range'
FROM syscolumns A, syscolumns B
)
UNION
(
SELECT TOP 11 -- [15; 25]
14 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range'
FROM syscolumns A, syscolumns B
)
-- INTERSECCION DE 2 RANGOS
(
SELECT TOP 9 -- [11; 19]
10 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range'
FROM syscolumns A, syscolumns B
)
INTERSECT
(
SELECT TOP 11 -- [15; 25]
14 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range'
FROM syscolumns A, syscolumns B
)
-- METODO 3
-- RANGO CON UNA SUBCONSULTA
USE [platzi]
SELECT *
FROM platzi.alumnos
WHERE tutor_id IN
(
SELECT TOP 11
9 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range'
FROM syscolumns A, syscolumns B
)
GO
/*
INTERSECCION ENTRE CARRERA_ID Y TUTOR_ID
*/
SELECT carrera_id AS interseccion
FROM
(
(
SELECT DISTINCT carrera_id
FROM platzi.alumnos
)
INTERSECT
(
SELECT DISTINCT tutor_id
FROM platzi.alumnos
)
) AS interseccion_ids
Reto:
<code>
SELECT *
FROM platzi.alumnos
WHERE tutor_id = carrera_id;
Mi respuesta :

'=>' Significa 'devuelve' en este apunte
'&&' si se solapan estos dos rangos
(11.1,22.2) && (20.0,30.0) => TRUE
(11.1,19.9) && (20.0,30.0) => FALSE
* Para seleccionar los elementos de la interseccion entre los dos rangos. SI no hay, marca error
SELECT int4ramge(10,20) * int4range(15,25) =>[15,20)
@> si el rango se encuentra en el grupo
SELECT *
FROM platzi.alumnos
WHERE int4range(10,20) @> tutor_id
SACAR EL RANGO QUE HAY ENTRE TUTOR_ID Y CARRERA_ID
SELECT int4range(min(tutor_id), max(tutor_id)) * int4range(min(carrera_id), max(carrera_id)) FROM platzi.alumnos;
SACAR LOS DATOS QUE PERTENECEN AL RANGO ENTRE TUTOR_ID Y CARRERA_ID
SELECT * FROM platzi.alumnos WHERE( SELECT int4range(MIN(tutor_id), MAX(tutor_id)) * int4range(MIN(carrera_id),MAX(carrera_id)) FROM platzi.alumnos ) @> tutor_id AND ( SELECT int4range(MIN(tutor_id), MAX(tutor_id)) * int4range(MIN(carrera_id),MAX(carrera_id)) FROM platzi.alumnos ) @> carrera_id;
++Selectores de rango++ Son especialmente útiles para utilizar en el WHERE statement.
SELECT int4range(1,20) @> 3;
Esta consulta trae un entero pequeño y pregunta si el rango contiene al numero 3
SELECT numrange(11,20) && numrange(20.0, 30.0);
Esta consulta trae un resultado booleano, ya que los && consultan entre los dos rangos de números de alta precisión si existen valores solapados entre ambos
SELECT LOWER int8range(15,25);
Simplemente trae el menor número del rango. Funciona igual con UPPER
SELECT int4range(10,20) * int4range(15,25);
Esta consulta trae el rango numérico que comparten ambos rangos
SELECT ISEMPTY(numrange(1,5));
Booleano que detecta si el rango esta vacío
Mi solución
SELECT
numrange(min_carrera, max_carrera) * numrange(min_tutor, max_tutor)
FROM (
SELECT
MIN(carrera_id) as min_carrera,
MAX(carrera_id) as max_carrera,
MIN(tutor_id) as min_tutor,
MAX(tutor_id) as max_tutor
FROM alumnos
) AS rangos
SELECT *
FROM platzi.alumnos
WHERE int4range(10,20) @> tutor_id
AND int4range(10,20) @> carrera_id```
John Alexander Ortiz Ramirez
Solucion del reto
SELECT INT4RANGE(MIN(tutor_id), MAX(tutor_id)) * INT4RANGE(MIN(carrera_id), MAX(carrera_id)) FROM platzi.alumnos;
carlos puican chan
buen aporte!!! ya me estaba complicando en hacer la tarea
Beder Danilo Casa Condori
gracias
Jeiner Muñoz Olivera
Como cuando crees que dominas Postgres y aparece esto. :O
Aaron Fabrizio Calderon Guillermo
Katherine Fabiola Quijano Díaz
Reto:
<code> SELECT * FROM platzi.alumnos WHERE tutor_id = carrera_id;
Andrés Felipe Sierra
yo en dic 2022 jajajja SELECT * FROM platzi.alumnos WHERE tutor_id = carrera_id;
Miguel Angel Reyes Moreno
Es lo que yo haría... no entiendo cuál es la necesidad de complicar las clases con queries complejas siendo que se pueden resolver algunos ejercicios de forma más sencilla.
Ruiz Julieth
Mi respuesta :
Edward Toledo López
'=>' Significa 'devuelve' en este apunte
'&&' si se solapan estos dos rangos
(11.1,22.2) && (20.0,30.0) => TRUE (11.1,19.9) && (20.0,30.0) => FALSE
* Para seleccionar los elementos de la interseccion entre los dos rangos. SI no hay, marca error
SELECT int4ramge(10,20) * int4range(15,25) =>[15,20)
@> si el rango se encuentra en el grupo
SELECT * FROM platzi.alumnos WHERE int4range(10,20) @> tutor_id
Jorge González González
SACAR EL RANGO QUE HAY ENTRE TUTOR_ID Y CARRERA_ID
SELECT int4range(min(tutor_id), max(tutor_id)) * int4range(min(carrera_id), max(carrera_id)) FROM platzi.alumnos;
SACAR LOS DATOS QUE PERTENECEN AL RANGO ENTRE TUTOR_ID Y CARRERA_ID
SELECT * FROM platzi.alumnos WHERE( SELECT int4range(MIN(tutor_id), MAX(tutor_id)) * int4range(MIN(carrera_id),MAX(carrera_id)) FROM platzi.alumnos ) @> tutor_id AND ( SELECT int4range(MIN(tutor_id), MAX(tutor_id)) * int4range(MIN(carrera_id),MAX(carrera_id)) FROM platzi.alumnos ) @> carrera_id;
Roberto Jassiel Montes Gutierrez
Muy bien, justamente así lo hice:
SELECT * FROM platzi.alumnos WHERE ( SELECT int4range(MIN(tutor_id),MAX(tutor_id)) * int4range(min(carrera_id),max(carrera_id)) FROM platzi.alumnos ) @> tutor_id AND (SELECT int4range(MIN(tutor_id),MAX(tutor_id)) * int4range(min(carrera_id),max(carrera_id)) From platzi.alumnos )@> carrera_id```
Aaron Quiroga
Angel Afonso
Mi solución
SELECT numrange(min_carrera, max_carrera) * numrange(min_tutor, max_tutor) FROM ( SELECT MIN(carrera_id) as min_carrera, MAX(carrera_id) as max_carrera, MIN(tutor_id) as min_tutor, MAX(tutor_id) as max_tutor FROM alumnos ) AS rangos
David Amador Morales
Herman Castillo R
SELECT * FROM platzi.alumnos WHERE int4range(10,20) @> tutor_id AND int4range(10,20) @> carrera_id```
Martin Javier Gamboa Guzman
RESPUESTA DEL RETO en MySQL
SELECT a.tutor_id,b.carrera_id FROM alumnos as a inner JOIN alumnos as b ON a.tutor_id = b.carrera_id group by a.tutor_id order by a.tutor_id
Nicolás Kryvenki
No esta mal, pero la idea es que uses las functions en esta clase Martin.
Yeiver Sanabria
Yo no conseguí hacerlo, y busque una alternativa para el int4range en mysql y no halle nada, dificilísimo migrar este query a MySQL.
Oscar Danilo Guzmán Villanueva
Hola, ¿Cuál es la diferencia entre int4range y int8range? ¿Qué es lo que realmente hace cada uno?
Juan Eduardo Quintero Palacio
Saludos,
La diferencia es que son distintos tipos de rango, por ejemplo:
int4range es el rango de un Integer int8range es el rango de un bigint
Si quieres entender un poco más acerca de los rangos te dejo el enlace a la documentación acerca de rangos aquí
Daniel Felipe Morales Reyes
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;
Alejandra Gonzalez Sosa
Te pasaste! Se ve tan facil.... excelente aporte!
Pablo Perez Dotel
Mi solución al Reto de la clase.
En este codigo se seleccionan todas las filas que contengan id en común entre carrera y tutor.
SELECT * FROM platzi.alumnos WHERE int4range((SELECT MIN(tutor_id) FROM platzi.alumnos), (SELECT MAX(tutor_id) FROM platzi.alumnos)) @> carrera_id;
Santiago Jejen Salinas
Robin Angel Romero
creo que tendras que cargar nuevamente los archivos .SQL que estan en el curso, aqui
Santiago Jejen Salinas
Muchas gracias, si me llega pasar en la vida laboral hay alguna opción
Pablo Perez Dotel
Solución al reto de la clase anterior
WITH cte AS ( SELECT id, ROW_NUMBER() OVER ( PARTITION BY nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id ORDER BY id ASC ) AS row FROM platzi.alumnos ) DELETE FROM platzi.alumnos USING cte WHERE platzi.alumnos.id = cte.id AND cte.row > 1;
Rafael Fierro
Por qu'e usar
WHERE int4range(10,20) @> tutor_id;
en vez de usar
WHERE tutor_id BETWEEN 10 AND 20;
?
Juan Becerra
¿Cuantos borramos la tabla de alumnos? xD
Franklin Paredes Trejo
Solución del reto:
WITH range_data AS ( SELECT MIN(tutor_id) AS min_tutor, MAX(tutor_id) AS max_tutor, MIN(carrera_id) AS min_carrera, MAX(carrera_id) AS max_carrera FROM platzi.alumnos ) SELECT int4range(min_tutor, max_tutor) * int4range(min_carrera, max_carrera) FROM range_data;
Andrés Atencia
Hola, una pregunta sobre el reto anterior. Ese query nos borraria las 2 filas repetidas. Pero como se hace si quiero dejar una?
En SQL Server
-- CREAR UN RANGO DE VALORES [9; 11] SELECT TOP 11 9 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range' FROM syscolumns A, syscolumns B -- UNION DE 2 RANGOS ( SELECT TOP 9 -- [11; 19] 10 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range' FROM syscolumns A, syscolumns B ) UNION ( SELECT TOP 11 -- [15; 25] 14 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range' FROM syscolumns A, syscolumns B ) -- INTERSECCION DE 2 RANGOS ( SELECT TOP 9 -- [11; 19] 10 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range' FROM syscolumns A, syscolumns B ) INTERSECT ( SELECT TOP 11 -- [15; 25] 14 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range' FROM syscolumns A, syscolumns B ) -- METODO 3 -- RANGO CON UNA SUBCONSULTA USE [platzi] SELECT * FROM platzi.alumnos WHERE tutor_id IN ( SELECT TOP 11 9 + ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY A.name) AS 'Range' FROM syscolumns A, syscolumns B ) GO /* INTERSECCION ENTRE CARRERA_ID Y TUTOR_ID */ SELECT carrera_id AS interseccion FROM ( ( SELECT DISTINCT carrera_id FROM platzi.alumnos ) INTERSECT ( SELECT DISTINCT tutor_id FROM platzi.alumnos ) ) AS interseccion_ids
++Selectores de rango++ Son especialmente útiles para utilizar en el WHERE statement.
SELECT int4range(1,20) @> 3;
Esta consulta trae un entero pequeño y pregunta si el rango contiene al numero 3
SELECT numrange(11,20) && numrange(20.0, 30.0);
Esta consulta trae un resultado booleano, ya que los && consultan entre los dos rangos de números de alta precisión si existen valores solapados entre ambos
SELECT LOWER int8range(15,25);
Simplemente trae el menor número del rango. Funciona igual con UPPER
SELECT int4range(10,20) * int4range(15,25);
Esta consulta trae el rango numérico que comparten ambos rangos
SELECT ISEMPTY(numrange(1,5));
Booleano que detecta si el rango esta vacío
Solo falta indicar la tabla, queda así:
SELECT numrange(min_carrera, max_carrera) * numrange(min_tutor, max_tutor) FROM ( SELECT MIN(carrera_id) as min_carrera, MAX(carrera_id) as max_carrera, MIN(tutor_id) as min_tutor, MAX(tutor_id) as max_tutor FROM platzi.alumnos ) AS rangos
Use este query y se me borro toda la base de datos, alguien sabe alguna forma de restaurar la base de datos a como estaba antes del DELETE, Gracias
DELETE FROM platzi.alumnos WHERE id IN (SELECT id FROM( SELECT id FROM ( SELECT ROW_NUMBER() OVER( PARTITION BY nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id ORDER BY id ASC) AS row FROM platzi.alumnos) AS duplicados WHERE duplicados.row >1) AS duplicados_id);```