miércoles, 21 de febrero de 2018

Buscando duplicados con SQLServer

Hay una manera muy simple para poder buscar duplicados en las tablas de SQLServer. Vamos a trabajar con la función ROW_NUMBER el cual va a ser un valor calculado cuando se ejecuta el query.

Primero vamos a crear una tabla muy simple

CREATE TABLE person(id int identity primary key,
name nvarchar(200) not null,
lastName nvarchar(200) not null,
email nvarchar(200) not null)

Con esa simple tabla vamos a ingresar algunos datos y luego a crear nuestro resultado para ver si existen duplicados.

Vamos a insertar los siguientes datos

INSERT INTO person(name, lastName, email) values('Oscar',' Arias','Oscar. Arias@example.com');

INSERT INTO person(name, lastName, email) values('Cleto','González','Cleto.González@example.com');

INSERT INTO person(name, lastName, email) values('Ricardo','Jiménez','Ricardo.Jiménez@example.com');

INSERT INTO person(name, lastName, email) values('Jesús','Jiménez','Jesús.Jiménez@example.com');

INSERT INTO person(name, lastName, email) values('Juan','Mora','Juan.Mora@example.com');

INSERT INTO person(name, lastName, email) values('José Rafael','De Gallegos','José Rafael.De Gallegos@example.com');

INSERT INTO person(name, lastName, email) values('Bernardo','Soto','Bernardo.Soto@example.com');

INSERT INTO person(name, lastName, email) values('José María','Montealegre','José María.Montealegre@example.com');

INSERT INTO person(name, lastName, email) values('José Joaquín','Trejos','José Joaquín.Trejos@example.com');

INSERT INTO person(name, lastName, email) values('José María','Figueres','José María.Figueres@example.com');

INSERT INTO person(name, lastName, email) values('Rodrigo','Carazo','Rodrigo.Carazo@example.com');

INSERT INTO person(name, lastName, email) values('Luis Alberto','Monge','Luis Alberto.Monge@example.com');

INSERT INTO person(name, lastName, email) values('Mario ','Echandi','Mario .Echandi@example.com');

INSERT INTO person(name, lastName, email) values('Otilio','Ulate','Otilio.Ulate@example.com');

INSERT INTO person(name, lastName, email) values('Teodoro','Picado','Teodoro.Picado@example.com');

INSERT INTO person(name, lastName, email) values('Rafael Ángel','Calderón','Rafael Ángel.Calderón@example.com');

INSERT INTO person(name, lastName, email) values('León','Cortés','León.Cortés@example.com');

INSERT INTO person(name, lastName, email) values('Julio','Acosta','Julio.Acosta@example.com');

INSERT INTO person(name, lastName, email) values('Braulio','Carrillo','Braulio.Carrillo@example.com');

INSERT INTO person(name, lastName, email) values('Manuel','Aguilar','Manuel.Aguilar@example.com');

INSERT INTO person(name, lastName, email) values('Francisco','Morazán','Francisco.Morazán@example.com');

INSERT INTO person(name, lastName, email) values('Francisco María','Oreamuno','Francisco María.Oreamuno@example.com');

INSERT INTO person(name, lastName, email) values('Daniel','Oduber','Daniel.Oduber@example.com');

INSERT INTO person(name, lastName, email) values('Juan Rafael','Mora','Juan Rafael.Mora@example.com');

INSERT INTO person(name, lastName, email) values('Bruno','Carranza','Bruno.Carranza@example.com');

INSERT INTO person(name, lastName, email) values('Tomás','Guardia','Tomás.Guardia@example.com');

INSERT INTO person(name, lastName, email) values('Aniceto','Esquivel','Aniceto.Esquivel@example.com');

INSERT INTO person(name, lastName, email) values('Vicente','Herrera','Vicente.Herrera@example.com');

INSERT INTO person(name, lastName, email) values('Próspero','Fernández','Próspero.Fernández@example.com');

INSERT INTO person(name, lastName, email) values('Carlos','Durán','Carlos.Durán@example.com');

INSERT INTO person(name, lastName, email) values('Rafael','Yglesias','Rafael.Yglesias@example.com');

INSERT INTO person(name, lastName, email) values('Ascensión','Esquivel','Ascensión.Esquivel@example.com');

INSERT INTO person(name, lastName, email) values('Alfredo','González','Alfredo.González@example.com');

INSERT INTO person(name, lastName, email) values('Federico','Tinoco','Federico.Tinoco@example.com');

INSERT INTO person(name, lastName, email) values('José','Figueres','José.Figueres@example.com');

Ahora vamos crear algunos queries para buscar los duplicados.

Para poder buscar duplicados vamos a utilizar la función partition que nos permite particionar los datos por las columnas que requerimos. Por ejemplo, si queremos ver si tenemos duplicados por nombre podemos hacer el siguiente query

select * from (
select row_number() over(partition by name order by name asc) as rowId, id, name,lastName, email  from person
) temp where rowId >1



Como vemos en el resultado tenemos un duplicado por el nombre José María. En este caso como queríamos buscar si hay nombres duplicados creamos la partición por el nombre y con esto se va generar el numero del row_number cualquier row que sea mayor a 1 quiere decir que es un duplicado de los datos.

select * from (
select row_number() over(partition by lastName order by name asc) as rowId, id, name,lastName, email  from person
) temp where rowId >1


Con este otro ejemplo estamos buscando duplicados usando el apellido. Si existen apellidos duplicados vamos a poder obtenerlos.

Como vemos tenemos 5 duplicados.

select * from (
select row_number() over(partition by lastName, name order by name asc) as rowId, id, name,lastName, email  from person
) temp where rowId >1



Ahora con este ultimo query vamos a buscar duplicados con el nombre y el apellido. Si ejecutamos el query nos damos cuanta que no hay duplicados con la combinación de nombre y apellidos. 

Etiquetas:

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio