No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso Pr谩ctico de SQL

Curso Pr谩ctico de SQL

Israel V谩zquez Morales

Israel V谩zquez Morales

Duplicados

15/29
Recursos

Query de inserci贸n

insert into platzi.alumnos (id, nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id) values (1001, 'Pamelina', null, '[email protected]', 4800, '2020-04-26 10:18:51', 12, 16)

Aportes 212

Preguntas 17

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Query Ejercicio:

insert into platzi.alumnos (id, nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id) values (1000, 'Pamelina', null, '[email protected]', 4800, '2020-04-26 10:18:51', 12, 16);

La cl谩usula HAVING es una implemetacion que el sistema gestor de bases de datos SQL crea para complementar el condicionante WHERE, ya que el condicionante WHERE no permite utilizar funciones de agregaci贸n como SUM, MAX, MIN o AVG, es decir, con un condicionante WHERE no podemos crear consultas v谩lidas que sean capaz de devolvernos los datos de los clientes que compraron m谩s de 1000 productos durante un a帽o, por ejemplo.

Tener esto en cuenta por si tampoco entendieron nada y este es su primer curso de base de datos 馃槈

Saludos, mi respuesta:

En el ejercicio de encontrar un DUPLICADO, se est谩 haciendo una partici贸n de la tabla de todos los valores en filas de cada una de las variables o columnas de la tabla a excepci贸n del id, el cual no puede ser igual y no se repite al ser una primary key.

Cuando se aplica esta partici贸n en cada valor se hace 煤nico los valores, es decir, cada row viene siendo una partici贸n, y al utilizar la funci贸n agregada que en este caso es ROW_NUMBER() va a contar los valores de cada una de las particiones haciendo que se reinicie los 鈥渘煤meros de fila鈥 cuando salta de partici贸n en partici贸n. por eso, cuando encuentra dos valores iguales, enumera los dos valores, dejando como valor en su row un 2.

Por si necesitan el c贸digo para insertar una fila

insert into platzi.alumnos (id, nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id) values (1001, 'Pamelina', null, '[email protected]', 4800, '2020-04-26 10:18:51', 12, 16);

隆脕nimo vas por la mitad!

Solucion al reto

DELETE
    FROM platzi.alumnos
    WHERE id IN (SELECT id FROM (
        SELECT *
            FROM (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
    ) AS duplicados
    WHERE duplicados.row > 1) AS duplicados_id);

Por l贸gica no puede existir 2 correos iguales, por lo tanto realice la actividad en base a eso

  • Primero certifique que exist铆an correos duplicados.
SELECT email,COUNT(*)
FROM platzi.alumnos
GROUP BY email
HAVING COUNT(*) > 1;

De esa forma obtuve el nombre del correo repetido, en base a ello, se que puedo realizar la agrupaci贸n por partici贸n utilizando unicamente el correo.

  • Ahora valido que obtengo el id del correo duplicado.
SELECT id 
FROM (
	SELECT id, ROW_NUMBER() OVER(PARTITION BY email ORDER BY id) AS row
	FROM platzi.alumnos
) AS duplicados
WHERE duplicados.row > 1;

Una vez certificado que obtengo el id del dato duplicado, procedo a borrar el registro.

DELETE FROM platzi.alumnos
where id = (
SELECT id 
FROM (
	SELECT id, ROW_NUMBER() OVER(PARTITION BY email ORDER BY id) AS row
	FROM platzi.alumnos
) AS duplicados
WHERE duplicados.row > 1
);

Para SQL Server:

-- METODO 1
-- MOSTRAR DUPLICADO A PARTIR DEL ID
USE [platzi]
SELECT *
FROM platzi.alumnos AS ou
WHERE 
(
	SELECT COUNT(*)
	FROM platzi.alumnos AS inr
	WHERE ou.id = inr.id
) > 1
GO


-- METODO 2
-- MOSTRAR DUPLICADO COMPARANDO TODOS LOS CAMPOS, EXCEPTO EL ID
USE [platzi]
SELECT CONCAT(platzi.alumnos.nombre,',',
			  platzi.alumnos.apellido,',',
			  platzi.alumnos.email,',',
			  platzi.alumnos.colegiatura,',',
			  platzi.alumnos.fecha_incorporacion,',',
			  platzi.alumnos.carrera_id,',',
			  platzi.alumnos.tutor_id), COUNT(*)
FROM platzi.alumnos
GROUP BY CONCAT(platzi.alumnos.nombre,',',
			  platzi.alumnos.apellido,',',
			  platzi.alumnos.email,',',
			  platzi.alumnos.colegiatura,',',
			  platzi.alumnos.fecha_incorporacion,',',
			  platzi.alumnos.carrera_id,',',
			  platzi.alumnos.tutor_id)
HAVING COUNT(*) >1
ORDER BY COUNT(*) DESC
GO


-- METODO 3
-- MOSTRAR DUPLICADO COMPARANDO TODOS LOS CAMPOS, EXCEPTO EL ID CON SUBCONSULTA
USE [platzi]
SELECT *
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
ORDER BY row DESC

Para los que usan MySQL Workbench, pueden encontrar los duplicados usando CONCAT_WS de la siguiente forma :

Por si quieren entender mejor como funciona el PARTITION BY, me sirvi贸 mucho para comprender:

Para encontrar duplicados basados en sus datos principales: nombre, apellido y email.

select (nombre,apellido,email)::text as datos_usuarios, count(*) as cantidad 
from platzi.alumnos
group by (nombre,apellido,email)
order by cantidad desc```

Ejercicio cumplido鈥

DELETE FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM (
	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
)AS duplicados
WHERE duplicados.row > 1);```

Soy bastante nuevo en este mundo as铆 que tuve que hacer una especie de corrida en fr铆o para entenderlo y poder crear una imagen en mi cabeza de lo que sucede en las subconsultas. Dejo esto que es lo que veo en mi mente sobre el c贸digo de la case por si a alguien le sirve. Me corrigen los expertos por fa c:

Para entender de manera mas simple lo que esta pasando en el ultimo query, les recomendo que corran esta query:

SELECT *, ROW_NUMBER() OVER(PARTITION BY colegiatura) AS row
FROM platzi.alumnos;

Asi se dan cuenta como funciona a menor escala para luego interpretar lo demas, espero ser de ayuda!

No me sirvieron los ejemplos en workbench 馃槮

Soluci贸n al reto anterior

SELECT * 
    FROM (
        SELECT *, 
			DATE_PART('YEAR', fecha_incorporacion) AS anio_incorporacion,
			DATE_PART('MONTH', fecha_incorporacion) AS mes_incorporacion
        FROM platzi.alumnos
    ) AS alumnos_con_anio
    WHERE anio_incorporacion = 2018 AND mes_incorporacion = 5;```

mismo resultado mucho mas f谩cil:

select nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id, count(nombre)
from platzi.alumnos
group by nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id
having count()>1

La solucion en MySQL WorkBench seria:

<SELECT *
FROM (
	SELECT *, YEAR(fecha_incorporacion) AS Ano, MONTH(fecha_incorporacion) AS Mes
    FROM platzi.alumnos
    ) AS Fechas
WHERE Ano=2018 AND Mes=5;>

Mi soluci贸n al reto (postgreSQL):

DELETE FROM platzi.alumnos
WHERE id IN(
SELECT table_alumnos.id
FROM (
	SELECT
		ROW_NUMBER() OVER(
			PARTITION BY
			a1.nombre,
			a1.apellido,
			a1.email,
			a1.colegiatura,
			a1.fecha_incorporacion,
			a1.carrera_id,
			a1.tutor_id
			ORDER BY a1.id ASC
		) AS row_alumnos, a1.*
	FROM platzi.alumnos as a1
) AS table_alumnos
WHERE table_alumnos.row_alumnos>1
)

15. Duplicados

SELECT *
FROM platzi.alumnos AS ou
WHERE (
	SELECT COUNT(*)
	FROM platzi.alumnos AS inr
	WHERE ou.id = inr.id
) > 1;

SELECT (platzi.alumnos.*)::text, COUNT(*)
FROM platzi.alumnos 
GROUP BY platzi.alumnos.*
HAVING COUNT(*) > 1;

SELECT (
	   platzi.alumnos.nombre,
	   platzi.alumnos.apellido,
	   platzi.alumnos.email,
	   platzi.alumnos.colegiatura,
	   platzi.alumnos.fecha_incorporacion,
 	   platzi.alumnos.carrera_id,
	   platzi.alumnos.tutor_id
	   )::text, COUNT(*)
FROM platzi.alumnos 
GROUP BY  platzi.alumnos.nombre,
	   platzi.alumnos.apellido,
	   platzi.alumnos.email,
	   platzi.alumnos.colegiatura,
	   platzi.alumnos.fecha_incorporacion,
 	   platzi.alumnos.carrera_id,
	   platzi.alumnos.tutor_id
HAVING COUNT(*) > 1;

SELECT *
FROM (
	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
)AS duplicados
WHERE duplicados.row > 1;

soluci貌n para eliminar el campo duplicado

DELETE
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM (
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
) AS duplicados
WHERE duplicados.row >1);

-- Tarea -> Eliminar los duplicados de la tabla platzi.alumnos
DELETE
FROM platzi.alumnos
WHERE id IN (SELECT id
FROM (
	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
) AS duplicados
WHERE duplicados.row > 1);

Lo que paso en el 煤ltimo query fue que en vez de contar los rows, como lo sol铆amos hacer, ahora los estamos separando de acuerdo a ciertas caracter铆sticas especificadas en la Partici贸n. Eso significa que ahora cada row con un name, email, lastname, career_id, tutor_id, etc. 煤nico van a tener un valor de 1 en la columna row. Cada vez que haya otra tupla igual, ese valor va a aumentar en uno

Para la tarea ocup茅 los dos m茅todos mezclados, tal vez en la pr谩ctica nada recomendado pero para fines de practicar me pareci贸 煤til.

SELECT *
FROM platzi.alumnos

WHERE(EXTRACT(MONTH FROM fecha_incorporacion)) = 05
and
(DATE_PART('YEAR', fecha_incorporacion)) = 2018
;```

Solucion:

DELETE
    FROM platzi.alumnos
    WHERE id IN (SELECT id FROM (
        SELECT *
            FROM (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
    ) AS duplicados
    WHERE duplicados.row > 1) AS duplicados_id);
```js SELECT * FROM platzi.alumnos WHERE EXTRACT(YEAR FROM fecha_incorporacion)=2018 and EXTRACT(MONTH FROM fecha_incorporacion)=05; SELECT * FROM ( SELECT *, EXTRACT(YEAR FROM fecha_incorporacion) as AnioIncorporacion, EXTRACT(MONTH FROM fecha_incorporacion) as MonthIncorporacion FROM platzi.alumnos ) AS alumnos_with_mont_and_year WHERE AnioIncorporacion=2018 and MonthIncorporacion=05; ```SELECT \* FROM platzi.alumnos WHERE EXTRACT(YEAR FROM fecha\_incorporacion)=2018 and EXTRACT(MONTH FROM fecha\_incorporacion)=05; SELECT \* FROM ( SELECT \*, EXTRACT(YEAR FROM fecha\_incorporacion) as AnioIncorporacion, EXTRACT(MONTH FROM fecha\_incorporacion) as MonthIncorporacion FROM platzi.alumnos ) AS alumnos\_with\_mont\_and\_year WHERE AnioIncorporacion=2018 and MonthIncorporacion=05;
pero digamos en el caso de control de inventarios, siempre vamos a tener datos repetidos pero con diferente fecha de ingreso, en ese caso como se controlar铆a los datos repetidos :(
Gracias, muchas opciones, muchas explicaciones, muchos aportes
```txt --ALUMNOS QUE SE INCORPORARON EN MAYO DEL 2018 SELECT* FROM ( SELECT *, DATE_PART('MONTH',fecha_incorporacion) AS mes_incorporacion, DATE_PART('YEAR',fecha_incorporacion) AS anio_incorporacion FROM PLATZI.alumnos ) as alumnos_con_fecha WHERE mes_incorporacion=5 and anio_incorporacion=2018 ```--ALUMNOS QUE SE INCORPORARON EN MAYO DEL 2018 SELECT\* FROM ( SELECT \*, DATE\_PART('MONTH',fecha\_incorporacion) AS mes\_incorporacion, DATE\_PART('YEAR',fecha\_incorporacion) AS anio\_incorporacion FROM PLATZI.alumnos ) as alumnos\_con\_fecha WHERE mes\_incorporacion=5 and anio\_incorporacion=2018
Para la parte de la function window row\_number() over(partition by ...) creo que se debi贸 haber explicado un poco mejor. Ac谩 encontr茅 la raz贸n del por qu茅 la proyecci贸n SQL que hizo el profe funciona <https://www.postgresqltutorial.com/postgresql-window-function/postgresql-row_number/>

Ejercicio de tarea:

DELETE FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM (
		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
	) AS duplicados
	WHERE duplicados.row > 1
);
Este tema es muy bueno, pero me gustar铆a saber 驴Qu茅 tan eficientes son estas estrategias en ambientes en donde se tienen grandes cantidades de datos?
::

Reto resuelto, bastante intuitivo.

DELETE FROM alumnos
WHERE id IN (
	SELECT id FROM (SELECT ROW_NUMBER() OVER(PARTITION BY nombre,apellido,email,colegiatura,fecha_incorporacion,carrera_id,tutor_id ORDER BY id) AS count_row, 
							* FROM alumnos) AS duplicados
	WHERE count_row > 1
)
Esta es mi solucion a la eliminacion de la fila duplicada: ```js DELETE FROM platzi.alumnos WHERE id = ( SELECT id FROM ( SELECT * FROM ( 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 ) AS duplicados WHERE duplicados.row > 1 ) ); ```
Mi solucion al reto de la clase pasada: ```js SELECT * FROM platzi.alumnos WHERE (DATE_PART('YEAR', fecha_incorporacion)) = 2019 AND (DATE_PART('MONTH', fecha_incorporacion)) = 5; ```
select \* from ( select \*, extract(year from (fecha\_incorporacion)) as ano, extract(month from (fecha\_incorporacion)) as mes from platzi.alumnos ) as ano1 where ano = 2020 and mes= 5;

ELIMINACION DE LOS REGISTROS DUPLICADOS

CONSULTA DE LOS REGISTROS DUPLICADOS:

Mi solucion al ejercicio:

Despu茅s de tantos intentos pude entenderle, esta es mi soluci贸n:

-- Eliminar duplicados con subquery
DELETE FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM (
		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
	) AS duplicados
	WHERE duplicados.row > 1); 

Soluci贸n al reto:

DELETE FROM platzi.alumnos
WHERE id IN (
    SELECT id
    FROM (
        SELECT id,
            ROW_NUMBER() OVER (
                PARTITION BY nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id
                ORDER BY id
            ) AS row_num
        FROM platzi.alumnos
    ) AS subquery
    WHERE subquery.row_num > 1
);

mi aporte

DELETE FROM platzi.alumnos
WHERE id IN (
    SELECT id
    FROM (
        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
    ) AS duplicado
    WHERE duplicado.row > 1
);

Mi soluci贸n

DELETE FROM platzi.alumnos
WHERE id=(
	SELECT id
	FROM (
		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
	) AS duplicados
	WHERE duplicados.row>1);

SQL SERVER
De esta forma puedo eliminar mas de un registro duplicado a la vez

DECLARE @DuplicateIds VARCHAR(MAX);

SELECT @DuplicateIds = STRING_AGG(Id, ',') WITHIN GROUP (ORDER BY Id)
FROM (
    SELECT Id,
        ROW_NUMBER() OVER (
            PARTITION BY Nombre, Apellido, Email ORDER BY Id ASC
        ) AS row
    FROM Platzi.Alumnos
) AS Duplicados
WHERE Duplicados.row > 1;

SELECT @DuplicateIds

DELETE FROM Platzi.Alumnos WHERE Id IN (SELECT VALUE FROM string_split(@DuplicateIds, ','));

Reto de la clase

DELETE FROM alumnos
WHERE id IN (
	SELECT id FROM (
	SELECT
	ROW_NUMBER() OVER(PARTITION BY nombre,apellido, email, colegiatura, 
					  fecha_incorporacion, carrera_id, tutor_id
					 ORDER BY id ASC) row,id
	FROM alumnos
	) duplicados
	WHERE row > 1
)

-- Otra forma
DELETE FROM alumnos
WHERE id IN
(
	SELECT MAX(id) FROM alumnos
	GROUP BY nombre,apellido,email,colegiatura,fecha_incorporacion, carrera_id, tutor_id
	HAVING COUNT(id) > 1
)

Esta fue mi soluci贸n:

SELECT nombre,fecha_incorporacion
FROM alumnos
WHERE ( EXTRACT(YEAR FROM fecha_incorporacion)=2018 AND EXTRACT(MONTH FROM fecha_incorporacion)=05);

Creo yo, que esto es bueno de p麓ractica, pero si ya estamos en un trabajo , o nosotros iniciamos la DB de alg煤n trabajo, creo que la mayoria de cosas tienen un identificador 煤nico, entonces esta practica es algo exagerada, pero es bueno que la sepamos, en casos extremos.

Por dar ejemplo una persona tiene su DNI (En M茅xico seria tu INE, donde tienes un n煤mero 煤nico que te identifica como persona), un auto tiene un no. serie, una laptop tambi茅n, aunque entiendo que a煤n as铆 puede haber error de dedo, lo prudente seria que si vas entrando hagas un chequeo al Datatype de cada tabla, y saber si ya tienen configurado el Unique en alguna columna, sino, primero verifica duplicados con estos comandos que vimos y luego activa en alguna columna prudente el Unique, as铆 si alguien m谩s ingresa un dato duplicado, ya sea error de dedo o intencional, lo botar谩 porque ya existe uno, haciendo as铆 una revisi贸n m谩s f谩cil de los dem谩s datos, pues ya tienes un gran filtro de seguridad anti duplicado.

Casi que no!
Reto: 驴C贸mo se realiza el borrado del d煤plicado de esta tabla con esta ultmina versi贸n del query?

DELETE 
FROM platzi.alumnos 
WHERE id IN (
SELECT id
FROM (
	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
) AS duplicados
WHERE duplicados.row > 1);

Eliminar filas duplicadas en modo hardcore:

DELETE FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM (
		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
) AS duplicados
WHERE duplicados.row > 1
);

Mis soluciones del reto

-- Traemos solo los usuarios que se incorporaron en mayo del 2018
SELECT *
    FROM PLATZI.ALUMNOS
    WHERE (DATE_PART("YEAR", FECHA_INCORPORACION)) = 2018
        AND (DATE_PART("MONTH", FECHA_INCORPORACION)) = 5;
-- Otra soluci贸n
SELECT *
    FROM PLATZI.ALUMNOS
    WHERE (EXTRACT(YEAR
    FROM FECHA_INCORPORACION) = 2018) AND( EXTRACT (MONTH
    FROM FECHA_INCORPORACION)= 5 );

La forma en que yo lo hice

SELECT nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id
from platzi.alumnos 
group by nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id
having count(*)>1;

Aqui tengo la respuesta:

SELECT *
FROM platzi.alumnos
WHERE(EXTRACT(YEAR FROM fecha_incorporacion)) = 2019;

SELECT *
FROM platzi.alumnos
WHERE(DATE_PART('MONTH', fecha_incorporacion)) = 05;

SELECT *
FROM platzi.alumnos
WHERE(EXTRACT(DAY FROM fecha_incorporacion)) = 18;

que les parece 馃榿

SELECT * FROM (
	SELECT *, DATE_PART('YEAR',fecha_incorporacion) AS anio_incorporacion,
	DATE_PART('MONTH',fecha_incorporacion) AS  mes_incorporacion
	FROM platzi.alumnos
)AS alumnos_con_anio
WHERE anio_incorporacion = 2019 and mes_incorporacion = 05;

Select *
from platzi.alumnos
where (extract(YEAR FROM fecha_incorporacion)) = 2018 and
(extract(MONTH FROM fecha_incorporacion)) = 5;

Como opini贸n personal creo que es una sesi贸n con bastantes elementos para haberla desarrollado en una sola clase, la verdad me result贸 bastante complejo entender el c贸digo y su funcionalidad predisamente por la cantidad de elementos que trae, lo digo como alguien que apenas est谩 aprendiendo SQL

Mi resoluci贸n al reto:

DELETE FROM platzi.alumnos
WHERE platzi.alumnos.id IN (
	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
);
DELETE 
FROM platzi.alumnos AS ou 
WHERE (
	SELECT COUNT(*)
	FROM platzi.alumnos AS inr
	WHERE ou.id = inr.id
) > 1;

select (nombre,apellido,email,colegiatura,fecha_incorporacion,carrera_id,tutor_id)::text as conta, count() from platzi.alumnos
group by conta HAVING COUNT(
)>1

Bueno yo lo har铆a as铆

SELECT nombre, 
	apellido, 
	email, 
	colegiatura, 
	fecha_incorporacion, 
	carrera_id, 
	tutor_id, 
	count(*)
FROM platzi.alumnos
GROUP BY nombre, 
	apellido, 
	email, 
	colegiatura, 
	fecha_incorporacion, 
	carrera_id, 
	tutor_id
HAVING count(*)>1;

鈥揜eto
SELECT *
FROM (
SELECT *,
DATE_PART(鈥榊EAR鈥, fecha_incorporacion) AS anio_incorporacion,
DATE_PART(鈥楳ONTH鈥, fecha_incorporacion) AS mes_incorporacion
FROM platzi.alumnos
) AS alumnos_con_anio
WHERE anio_incorporacion = 2018 AND mes_incorporacion = 05;

DELETE 
FROM platzi.alumnos
WHERE id IN ( SELECT id FROM (
SELECT *
		FROM (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
    ) AS duplicados
    WHERE duplicados.row > 1) AS duplicado);

select * from (
SELECT *,EXTRACT(year FROM fecha_incorporacion) as anio,EXTRACT(month FROM fecha_incorporacion) as mes from platzi.alumnos
) as tablaconanio
where anio= 2018 and mes=05

Que salto gigante esta clase

DELETE FROM platzi.alumnos
WHERE id IN (
		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);

SELECT * FROM platzi.alumnos
WHERE (EXTRACT (YEAR FROM fecha_incorporacion) )= 2018
and (extract (month from fecha_incorporacion))=05;

select * FROM (
select *, date_part (鈥榊EAR鈥, fecha_incorporacion) as anio_incorp,
date_part (鈥楳ONTH鈥, fecha_incorporacion) as mes_incorp
FROM platzi.alumnos)
as alumnos_con_anio_mes
where anio_incorp=2018
and mes_incorp=05;

el ORDER BY id ASC dentro de la subquery es importante ya que va a ser el encargado de mostrate el id correcto (1001). Cuando no es colocado el ORDER mostrara el 1000 y si bien estaria marcando un duplicado, no estaria marcando el ultimo registro duplicado

DELETE
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM (
		SELECT id, ROW_NUMBER() OVER(
			PARTITION BY 
			nombre,
			apellido, 
			fecha_incorporacion,
			carrera_id,
			tutor_id
			ORDER BY id) AS row_number
		FROM platzi.alumnos
	) AS duplicates
	WHERE duplicates.row_number > 1
);

RETO

DELETE
FROM platzi.alumnos
WHERE id in (SELECT id   
	 FROM (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
	 )AS duplicado
	WHERE duplicado.row	>1)

Mi solucion para borrar datos duplicados

delete
from platzi.alumnos
where id in(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 duplicado
where duplicado.row>1) 

Otra soluci贸n para encontrar los duplicados:
SELECT
Cast (nombre as VARCHAR(50))
|| coalesce(cast(apellido as VARCHAR(50)), 鈥 ')
|| cast (email as VARCHAR(50))
|| cast (colegiatura as FLOAT)
|| cast (fecha_incorporacion as VARCHAR(50))
|| cast (carrera_id as INT)
|| cast (tutor_id as INT)
,Count()
from platzi_alumnos
group by 1
HAVING COUNT () > 1

Mi soluci贸n al reto fue:

DETELE
FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM (
	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
) AS duplicados
WHERE duplicados.row >1);

SELECT * FROM platzi.alumnos
WHERE (EXTRACT(YEAR FROM fecha_incorporacion))= 2020
AND (EXTRACT(MONTH FROM fecha_incorporacion))=6

Comparto mi manera de solucionar el reto, por si a alguien le sirve 馃槂:

delete 
FROM platzi.alumnos AS A 
USING (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 (A.id = DUPLICADOS.id) AND DUPLICADOS.Row > 1;

SELECT apellido,nombre,email,COUNT()
FROM platzi.alumnos
GROUP BY apellido, nombre, email
HAVING COUNT(
) > 1;

encontrado por 3 campos iguales

as铆 es como solucione el reto la sentencia with te permite hacer tablas temporales que hacen mas facil de leer el codigo

WITH duplicados as (
	SELECT	*
	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
	) duplicados
	WHERE duplicados.row > 1
)

DELETE FROM platzi.alumnos as al
WHERE al.id in (
	SELECT id from duplicados
)

S铆 quisieras tener los duplicados de la columna ID m谩s r谩pido (20 ms menos). Utiliza JOIN y GROUP BY antes que WHERE solo. Aqu铆 el c贸digo:

SELECT *
FROM platzi.alumnos AS foo
JOIN (
	SELECT id, COUNT(*) AS counter
	FROM platzi.alumnos
	GROUP BY id
) AS bar
ON foo.id = bar.id
WHERE counter != 1;

DELETE FROM platzi.alumnos
WHERE id IN
(
SELECT id
FROM (
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
) duplicados
WHERE duplicados.row > 1
);

Doble punto equivalente a un "cast" convertir estos campos en un texto

Rara vez vamos a poder encontrar un duplicado por el "id" debido a que este es consecutivo por ende es algo dificil que se repitan aun asi la informacion sea la misma.

Creo que la clase de windows functions debi贸 ponerse al principio del curso para saber realmente como funciona el c贸digo que usamos y no simplemente copiar del profesor.

delete from platzi.alumnos where id =(
	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
);

Tarea de la clase anterior

select 
fecha_incorporacion
from platzi.alumnos
	where date_part('MONTH', fecha_incorporacion) = 05
	AND date_part('YEAR', fecha_incorporacion) = 2018
SELECT * FROM platzi.alumnos AS ou
	WHERE (
		SELECT COUNT(email)
		FROM platzi.alumnos AS inr
		WHERE ou.email = inr.email
	) > 1;

Bueno del ejercicio dado la clase anterior aporto mi respuesta

select *
from platzi.alumnos
where (extract (year from fecha_incorporacion)) =2018
and (extract (month from fecha_incorporacion)) =05;

** RETO**
Borrar los registros duplicados de la tabla alumnos, se debe mantener el primer id registrado.

DELETE FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM (
		SELECT ROW_NUMBER() OVER(
			PARTITION BY 
				a1.nombre,
				a1.apellido,
				a1.email,
				a1.colegiatura,
				a1.fecha_incorporacion,
				a1.carrera_id,
				a1.tutor_id
			ORDER BY id ASC) orden, a1.*
		FROM platzi.alumnos a1
	) data_alumnos_row
	WHERE orden > 1
);

select * from (
select *, date_part(鈥榊EAR鈥,fecha_incorporacion)as anio_inc,
date_part(鈥楳ONTH鈥,fecha_incorporacion)as mes_inc from alumnos) as alumnos_anio
where anio_inc = 2018 and mes_inc = 5

DELETE FROM (
platzi.alumnos
WHERE id IN(
SELECT id
FROM (
SELECT id, ROW_NUMBER () OVER(
PARTITION BY nombre, apellido, email
ORDER BY id ASC)
AS ROW_NUM
FROM platzi.alumnos) AS doble
WHERE ROW_NUM>1);

Con esta peque帽a modificaci贸n se puede insertar varias veces sin que tengamos problemas con el id

insert into platzi.alumnos (id, nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id) values ((select max (id+1) from platzi.alumnos), 'Pamelina', null, '[email protected]', 4800, '2020-04-26 10:18:51', 12, 16)

Hola! de esta manera borr茅 los duplicados del ejercicio propuesto:

DELETE
FROM platzi.alumnos
WHERE id IN (
	SELECT id
	FROM ( 
		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
	) duplicados
	WHERE duplicados.row > 1
)

SELECT *
FROM (
SELECT *,
DATE_PART(鈥榊EAR鈥, fecha_incorporacion) AS anio_incorporacion,
DATE_PART(鈥楳ONTH鈥,fecha_incorporacion) AS mes_incorporacion
FROM platzi.alumnos
) AS alumnos_con_anio_mes
WHERE anio_incorporacion = 2018 and mes_incorporacion = 5;

SQL SERVER
Ver duplicados
SELECT
nombre,
apellido,
email,
colegiatura,
fecha_incorporacion,
carrera_id,
tutor_id,
COUNT()
FROM
alumnos
GROUP BY
nombre,
apellido,
email,
colegiatura,
fecha_incorporacion,
carrera_id,
tutor_id
HAVING COUNT(
) > 1

SQL SERVER
Actualizaci贸n de los 煤ltimos dos registros:
UPDATE alumnos
SET nombre = 鈥楨lwin鈥, apellido = 鈥楲eamy鈥, email = 鈥[email protected]鈥,
colegiatura = 2300, fecha_incorporacion = 鈥2021-09-02鈥, carrera_id = 8,
tutor_id = 12
WHERE id in (999,1000)

SQL SERVER
Soluci贸n 鈥淪eleccionar por a帽o鈥
SELECT *
FROM (
SELECT
YEAR(fecha_incorporacion) AS a帽o,
MONTH(fecha_incorporacion) AS mes
FROM alumnos
) AS reto
WHERE reto.a帽o = 2020 AND reto.mes = 05