e8d soluciones Skip Navigation Links

Soluciones

REGISTROS DUPLICADOS EN UNA TABLA

Introducción

En ocasiones se producen inserciones de datos sin llevar un control sobre ello y cuando llega el momento de consultar los datos obtenemos información que puede estar repetida. ¿Cómo podemos solucionar este inconveniente? A lo largo de este artículo conocerás algunos de los métodos más utilizados para conocer registros duplicados.

Vamos a utilizar la siguiente tabla y datos a modo de prueba:

Creacción de tabla

Inserción de datos

Método 1

En primer lugar, encontramos HAVING COUNT. Con HAVING COUNT contaremos registros que cumplan los mismos requisitos y si el resultado de esa cuenta es mayor a 1, borraremos registros hasta que solo quede uno.

Ejemplo:

Método 1

Al ejecutar estas sentencias estamos realizando lo siguiente:

  • Movemos cualquier fila duplicada en la tabla original a la segunda tabla.
  • Elimina las filas de la tabla original que se encuentren en la segunda tabla.
  • Inserta en la tabla original los datos de la segunda tabla.
  • Elimina la segunda tabla.

Este es un método sencillo, pero necesita de espacio en la base de datos para crear una nueva tabla y también producirá una sobrecarga ya que está moviendo los datos.

Método 2

Se trata de CROSS_APPLY. Su uso es muy parecido a INNER JOIN. En este ejemplo se realiza una subconsulta y se compara con la misma tabla donde queremos comprobar la existencia de registros duplicados para en caso afirmativo, borrarlos.

Método 2

Este método cumple su finalidad, pero puede presentar algunos inconvenientes dependiendo del tipo de sentencia que se lleve a cabo:

  • Como se puede observar en este caso, se realizan varias subconsultas lo que puede significar una ralentización en su ejecución.
  • El uso del operador NOT IN puede llegar a suponer un problema si tenemos algún campo NULL en alguno de los registros.
  • No conoceremos la cantidad de registros duplicados que teníamos.

Método 3

La función RANK toma como referencia el campo por el que se ordena. Si este campo es el mismo para varios registros duplicados, les asignará el valor 1 a todos ellos dentro de ese ranking. Sin embargo, cuando el campo de ordenación es distinto pero la partición sigue siendo la misma, se le asigna otro valor correspondiendo con la posición que ocupa en el ranking.

La sintaxis para esta función es la siguiente:

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Ejemplo:

Método 3

Resultado método 3

El registro con valor 22443 en el campo “Documento” tiene 6 registros iguales pero el campo de ordenación cambia en dos ocasiones. La primera vez que cambia el campo de ordenación es en la posición 4 y el segundo cambio es en la posición 6 asignando estos valores en el ranking.

Método 4

La función DENSE_RANK funciona de una forma muy similar a RANK, tomando como referencia los mismos campos, pero arrojando datos de una forma diferente. En primer lugar, cuando encuentra registros duplicados, les asignará el valor 1 y cuando el campo de ordenación se modifique pasará a asignar el valor 2 y así sucesivamente.

La sintaxis es la siguiente:

DENSE_RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Ejemplo:

Método 4

Resultado método 4

Para el registro con valor 22443 en el campo “Documento” podemos observar que a los primeros registros les asigna el valor 1, cuando cambia el campo de ordenación les asigna el valor 2 y posteriormente el valor 3.

Método 5

Este quinto método, al igual que los dos anteriores, utiliza un campo para ordenar y otro como partición. Para una serie de registros duplicados, estos aparecerán con un valor que les identifique, por ejemplo: si tengo dos registros iguales, uno de ellos tomará el valor 1 y el otro el valor 2.

La sintaxis es la siguiente:

ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

Con la siguiente sentencia podremos conocer que registros tenemos repetidos en nuestra tabla:

Método 5

Resultado método 5

El registro con valor 22443 en el campo “Documento” tiene 6 registros iguales y cada uno de ellos toma un valor distinto.


A continuación, en la siguiente tabla se hace una comparativa entre los métodos 3, 4 y 5 para, de una forma más visual, comprender el funcionamiento de cada uno de ellos:

Comparativa

Conclusión

Con todos los métodos expuestos a lo largo del artículo, nuestra recomendación es utilizar ROW_NUMBER por los siguientes motivos:

  • Nos permite identificar con claridad la cantidad de registros duplicados.
  • No se produce movimiento de datos entre tablas.
  • No se crean nuevas tablas.
  • Los planes de ejecución no conllevan una sobrecarga para la base de datos.

Mapa del sitio

HOME

EMPRESA

SERVICIOS

DATOS DISPONIBLES

TRATAMIENTO DE DATOS

GEOGRÁFICOS

ANÁLISIS ESTADÍSTICO DE DATOS

BUSINESS INTELLIGENCE

AUDITORÍA INFORMÁTICA

CONTACTO


Contacto

telefono e8d        91 355 29 30

telefono e8d       Ctra. Villaverde Vallecas Km 3.5 (C.T.M.-Oficina 801A)

email e8d info@e8dsoluciones.es



Política de privacidad

Política de calidad y medio ambiente

Política de cookies