Volver a la lista de artículos Artículos
Lectura de 10 minutos

Limpieza de datos en SQL

La limpieza de datos es una parte importante de cualquier análisis de datos. Aquí discutiremos las técnicas que puedes usar para hacer limpieza de datos en SQL.

Me resulta casi imposible concentrarme en el trabajo cuando mi escritorio está desordenado. Si está lleno de papeles, tazas de café o juguetes que mi hija ha colado en mi despacho, no hay ninguna posibilidad de que pueda hacer nada hasta que mi mesa vuelva a estar en orden. Por alguna razón, es como si el desorden de mi mesa se hubiera colado en mi mente.

Esta misma idea es aplicable a la limpieza de datos. Muchas veces he dedicado horas a un análisis y he sacado mis conclusiones sólo para descubrir una incoherencia en los datos que invalida todo mi informe. Como analistas, solemos lanzarnos directamente a analizar los datos sin tomarnos el tiempo necesario para asegurarnos de que están limpios. Esto puede dar lugar a muchas horas de tiempo perdido o, lo que es peor, a informes inexactos.

¿Qué es la limpieza de datos?

El proceso de limpieza de datos (también denominado depuración de datos) consiste en identificar cualquier imprecisión en un conjunto de datos y, a continuación, corregirla. Es el primer paso en cualquier análisis e incluye la eliminación de datos, la actualización de datos y la búsqueda de incoherencias o cosas que simplemente no tienen sentido.

Puede aprender todas las funciones SQL necesarias para limpiar datos en SQL en nuestro Curso completo de SQL curso. La pista contiene 7 cursos interactivos de SQL que le enseñarán SQL completo, desde lo más básico, pasando por temas intermedios y hasta conceptos avanzados de SQL como funciones de ventana y consultas recursivas. Es el conjunto de cursos de SQL más completo disponible en Internet.

Técnicas de limpieza de datos

Ahora que ya te has hecho una idea, vamos a echar un vistazo a las técnicas SQL que puedes utilizar para limpiar datos. Para cada ejemplo, utilizaremos la tabla de empresas que se muestra a continuación. Muestra información sobre varias empresas:

idnameindustryyear_foundedemployeesstatecity
1Over-HexSoftware200625TXFranklin
2UnimattaxIT Services200936TXNewtown Square
3LexilaReal Estate203238ILTinley Park
4GreenfaxRetail2012320scGreenville
5SaoaceEnergy200924WINew Holstein
6DonplusAdvertising & Marketing200926caLos Angeles
7BlacklaneIT Services20119CAOrange
8ToughtamLogistics & Transportation201120ALBirmingham
9ToughtamLogistics & Transportation201120ALBirmingham
10QuotelaneAdvertising & MarketingNULL4SCGreenville
11GanzzapAdvertising & Marketing2011133CASan Francisco
12YearflexNULL201345WIMadison

Cómo y Cuándo Eliminar Datos

A veces se encontrará con situaciones en las que necesitará eliminar datos de su conjunto de datos. Esto puede deberse a que los datos no son pertinentes para lo que está analizando o están duplicados o son inexactos. En los siguientes ejemplos, exploraremos estos diferentes escenarios y cómo abordarlos.

Ejemplo 1. Eliminar datos duplicados Eliminación de datos duplicados

Lo primero que haremos será buscar datos que deban eliminarse. Esto puede deberse a duplicados o a que los datos no son relevantes. En esta tabla, podemos ver rápidamente que la fila de la empresa Toughtam está duplicada. Esto no será tan fácil de identificar en un conjunto de datos grande. Antes de eliminar esa fila, veamos cómo encontrarla.

En este conjunto de datos, cada empresa debería tener sólo una fila, así que vamos a utilizar las cláusulas GROUP BY y HAVING para identificar los nombres duplicados. Esta consulta va a contar el número de veces que cada nombre existe en la base de datos utilizando GROUP BY. A continuación, utiliza la cláusula HAVING para filtrar los resultados sólo para los nombres que existen más de una vez.

SELECT name, 
	 COUNT(name) as count
FROM companies
GROUP BY name
HAVING(count > 1)

Esta consulta devolverá el siguiente resultado:

namecount
Toughtam2

¡Genial! Ahora sabemos que la empresa llamada Toughtam está duplicada, pero ¿cómo eliminamos una de las filas? Utilizaremos una combinación de ROW_NUMBER() y DELETE. En primer lugar, vamos a añadir un número de fila para cada fila basado en la columna nombre:

SELECT name, 
	 ROW_NUMBER() OVER(PARTITION BY name) AS rn
FROM companies
idnameindustryyear_foundedemployeesstatecityrn
1Over-HexSoftware200625TXFranklin1
2UnimattaxIT Services200936TXNewtown Square1
3LexilaReal Estate203238ILTinley Park1
4GreenfaxRetail2012320scGreenville1
5SaoaceEnergy200924WINew Holstein1
6DonplusAdvertising & Marketing200926caLos Angeles1
7BlacklaneIT Services20119CAOrange1
8ToughtamLogistics & Transportation201120ALBirmingham1
9ToughtamLogistics & Transportation201120ALBirmingham2
10QuotelaneAdvertising & MarketingNULL4SCGreenville1
11GanzzapAdvertising & Marketing2011133CASan Francisco1
12YearflexNULL201345WIMadison1

Lo que hemos hecho es añadir una nueva columna que muestra el número de fila de cada nombre. Como puedes ver, ahora hay un 1 y un 2 para las filas de Toughtam. Ahora ejecutaremos una sentencia DELETE para eliminar cualquier fila en la que la columna rn sea mayor que 1.

DELETE 
FROM (
SELECT name, 
	 	ROW_NUMBER() OVER(PARTITION BY name) AS rn
FROM companies
) 
WHERE rn > 1

Ahora nuestro conjunto de datos tiene este aspecto:

idnameindustryyear_foundedemployeesstateCity
1Over-HexSoftware200625TXFranklin
2UnimattaxIT Services200936TXNewtown Square
3LexilaReal Estate203238ILTinley Park
4GreenfaxRetail2012320scGreenville
5SaoaceEnergy200924WINew Holstein
6DonplusAdvertising & Marketing200926caLos Angeles
7BlacklaneIT Services20119CAOrange
8ToughtamLogistics & Transportation201120ALBirmingham
10QuotelaneAdvertising & MarketingNULL4SCGreenville
11GanzzapAdvertising & Marketing2011133CASan Francisco
12YearflexNULL201345WIMadison

Ejemplo 2: Ordenar los datos antes de eliminarlos

En este ejemplo, las filas de Toughtam son las mismas (con la excepción de id), por lo que no estamos ordenando las filas por otra cosa que no sea cómo aparecen en la base de datos. Muchas veces, encontrará que las filas están duplicadas, pero puede que los campos no sean idénticos. Si este es el caso, puede añadir una cláusula ORDER BY después de PARTITION BY.

Por ejemplo, supongamos que los datos tuvieran este aspecto:

idnameindustryyear_foundedemployeesstatecreated
8ToughtamLogistics & Transportation201120AL1/3/2023
9ToughtamLogistics & Transportation201130AL1/10/2023

Parece que este registro se actualizó para esta empresa el 20/01/2023 y el número de empleados aumentó. Si quisiéramos mantener el registro más reciente, ejecutaríamos:

DELETE 
FROM (
SELECT name, 
	 	ROW_NUMBER() OVER(PARTITION BY name ORDER BY created DESC) AS rn
FROM companies
) 
WHERE rn > 1

Como puede ver, ahora estamos ordenando la sentencia ROW_NUMBER() por el campo created en orden descendente, sacando primero el registro creado más recientemente. A continuación, eliminamos los registros posteriores al primero.

Para obtener más información sobre la búsqueda de valores duplicados en SQL, consulte nuestro artículo Cómo buscar valores duplicados en SQL.

Ejemplo 3: Eliminación de valores nulos

Ahora echemos un vistazo a NULLs. NULL indica un valor que falta; puede leer más sobre ellos aquí. Dependiendo de las implicaciones de los valores de NULL en sus datos, puede eliminar esas filas o puede actualizarlas. En nuestro ejemplo, vemos dos valores NULL. Una fila tiene un valor NULL para la industria y la otra para el year_founded. Vamos a manejar cada uno de una manera diferente.

Una empresa debe tener un año de fundación. Vamos a utilizar DELETE para eliminar esa fila en la que falta, ya que parece ser un dato erróneo.

SELECT
FROM companies 
WHERE year_founded IS NULL 
idnameindustryyear_foundedemployeesstatecity
10QuotelaneAdvertising & MarketingNULL4SCGreenville

En la consulta anterior, estamos utilizando la cláusula IS NULL. Esta cláusula busca en la columna year_founded y devuelve cualquier fila en la que aparezca IS NULL. Una vez que verifiquemos que esta es la fila que queremos eliminar, podemos borrarla ejecutando:

DELETE
FROM companies 
WHERE year_founded IS NULL 

En este punto, hemos terminado de eliminar los datos erróneos y estamos listos para pasar a la sentencia UPDATE. Usemos esto para arreglar nuestro otro valor NULL.

Cómo actualizar datos

La sentencia UPDATE se utiliza para modificar datos existentes. Usted utilizaría esta técnica de limpieza de datos cuando corrige datos inexactos o para formatear sus datos (haciéndolos más legibles). En los siguientes ejemplos, recorreremos estos tipos de escenarios para entender cómo manipular datos utilizando UPDATE.

Ejemplo 1: Poner una etiqueta significativa a los valores NULL

Como ya hemos visto, hay una empresa que tiene un valor NULL para industria. Estamos de acuerdo con esto porque, en nuestra situación hipotética, sabemos que no todas las industrias están disponibles en nuestra base de datos. Lo que tenemos que hacer en esta situación es actualizar el NULL para que sea "Otro". Otra opción sería sustituir NULLs por "NA" o "No aplicable".

En primer lugar, vamos a utilizar SELECT para extraer la fila con la industria NULL:

SELECT *
FROM companies 
WHERE industry IS NULL 
idnameindustryyear_foundedemployeesstatecity
12YearflexNULL201345WIMadison

Ahora que sabemos que hemos extraído la fila correcta, podemos UPDATE la columna de la industria. Para ello, ejecutaremos

UPDATE companies 
SET industry = ‘Other’
WHERE industry IS NULL 

Al utilizar UPDATE, lo primero que tenemos que hacer es identificar la tabla que queremos modificar. En nuestro ejemplo, esta tabla es companies. A continuación, tenemos que decir qué columna estamos actualizando y a qué la estamos actualizando. Identificamos la columna utilizando SET [column name]. Luego definimos a qué queremos cambiar la columna usando = [ valor ]. La cláusula WHERE es la misma que si escribiéramos una sentencia SELECT. Sólo queremos cambiar el sector a "Otros" si el sector IS NULL.

Ejemplo 2: Corregir las mayúsculas de los valores

En este punto nuestros datos se ven mejor, pero a la columna state le vendría bien un poco de limpieza. Algunos de los valores están en mayúsculas y otros en minúsculas. Normalmente, la abreviatura del estado se escribe en mayúsculas, así que actualicemos todos los valores en minúsculas a mayúsculas.

idnameindustryyear_foundedemployeesstatecity
1Over-HexSoftware200625TXFranklin
2UnimattaxIT Services200936TXNewtown Square
3LexilaReal Estate203238ILTinley Park
4GreenfaxRetail2012320scGreenville
5SaoaceEnergy200924WINew Holstein
6DonplusAdvertising & Marketing200926caLos Angeles
7BlacklaneIT Services20119CAOrange
8ToughtamLogistics & Transportation201120ALBirmingham
11GanzzapAdvertising & Marketing2011133CASan Francisco
12YearflexOther201345WIMadison

Como queremos asegurarnos de que todos los valores de estado están en mayúsculas, podemos ejecutar:

UPDATE companies 
SET state = UPPER(state)

Cuando rodea el nombre de una columna con la sentencia UPPER(), está cambiando todas las letras a mayúsculas. (Con la sentencia LOWER(), se hace lo contrario - cambiar todas las letras a minúsculas). Ahora nuestra tabla tiene este aspecto:

idnameindustryyear_foundedemployeesstatecity
1Over-HexSoftware200625TXFranklin
2UnimattaxIT Services200936TXNewtown Square
3LexilaReal Estate203238ILTinley Park
4GreenfaxRetail2012320SCGreenville
5SaoaceEnergy200924WINew Holstein
6DonplusAdvertising & Marketing200926CALos Angeles
7BlacklaneIT Services20119CAOrange
8ToughtamLogistics & Transportation201120ALBirmingham
11GanzzapAdvertising & Marketing2011133CASan Francisco
12Yearflex‘Other’201345WIMadison

Ejemplo 3: Corregir errores lógicos

Una última cosa que querrá buscar en su conjunto de datos son los errores lógicos. En nuestros datos, vemos que una empresa tiene un valor year_founded de 2032. Esto no es posible, ya que una empresa no puede fundarse en el futuro. Podemos identificar los registros con fecha futura ejecutando

SELECT *
FROM companies 
WHERE year_founded > CURRENT_TIMESTAMP()

CURRENT_TIMESTAMP() devuelve la fecha y hora actuales. En la sentencia anterior, estamos extrayendo todos los registros en los que year_founded es posterior a la hora en que se ejecuta la consulta. También se puede introducir una fecha, como la de hoy.

Después de indagar un poco, vemos que se trata de un error tipográfico y que la empresa se fundó en 2012, por lo que seguiremos adelante y modificaremos ese registro:

UPDATE companies
SET year_founded = 2012
FROM companies 
WHERE id = 3
idnameindustryyear_foundedemployeesstatecity
1Over-HexSoftware200625TXFranklin
2UnimattaxIT Services200936TXNewtown Square
3LexilaReal Estate201238ILTinley Park
4GreenfaxRetail2012320SCGreenville
5SaoaceEnergy200924WINew Holstein
6DonplusAdvertising & Marketing200926CALos Angeles
7BlacklaneIT Services20119CAOrange
8ToughtamLogistics & Transportation201120ALBirmingham
11GanzzapAdvertising & Marketing2011133CASan Francisco
12Yearflex‘Other’201345WIMadison

En este caso, especificamos un id concreto en la cláusula WHERE. Esto se debe a que lo más probable es que no desee actualizar todos los valores de year_founded para que sean del mismo año para cualquier empresa que tenga un año de fundación en el futuro. Conocemos el año de fundación de esta empresa en concreto, así que sólo actualizaremos ese registro.

Recuerde siempre limpiar sus datos

Nuestros datos parecen ahora mucho más claros que el conjunto de datos original. La limpieza de datos, aunque tediosa, es una parte imprescindible del proceso de análisis de datos. Nunca dé por sentado que los datos con los que trabaja están limpios. Explore los datos buscando duplicados, NULLs y cualquier falacia lógica.

Ahora ya conoce varias técnicas SQL que puede utilizar para modificar sus datos, como DELETE y UPDATE. Un gran paso siguiente es tomar la Curso completo de SQL curso. Contiene 7 cursos interactivos de SQL, incluyendo un curso completo sobre las cláusulas DELETE, UPDATE, y INSERT. Este curso te ayudará a reforzar todo lo que has aprendido en este artículo y te dará la oportunidad de practicar más. ¡Feliz limpieza de datos!