Cuando tenemos registros repetidos o duplicados.

Los : : significa CONCATENAR en cadena de texto separado por comas.

CURSO

Como la Data de las tablas esta Normalizada pues no hay Datos duplicados, entonces para el ejercicio ingresamos unos Datos para probar este tema.

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);
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;
  1. Insertamos un alumno Duplicado con ID ya usado.
  1. Simplemente estamos filtrando los alumnos cuyo ID se encuentre más de una vez en la tabla.

  2. Estamos convirtiendo todo el registro a un texto. Además, estamos obteniendo la suma de los registros, agrupada por todos los campos, de tal forma que los duplicados tengan su suma mayor a 1.

Es más común encontrar registros duplicados pero que tengan diferente ID, para este caso las consultas podrían ser así:

Seleccionamos alumnos duplicados con los mismos valores (Menos el ID).

GROUP BY

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;

SUB-QUERY y WINDOW FUNCTION (Nueva Forma)

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;

RETO

Eliminar los registros duplicados.

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
);