Lea nuestro artículo sobre

.

En su actividad diaria, los analistas Data Engineer y Data deben mejorar los procesos de ingestión data. Más allá de las pruebas unitarias habituales, puede resultar interesante comparar fácil y rápidamente dos conjuntos data (es decir, tablas, vistas, consultas, etc.) con distintos fines, como el análisis de impacto o las pruebas de no regresión. Asimismo, la identificación de discrepancias entre dos puntos de vista de una tabla instantánea resulta bastante útil para el análisis ad hoc o la depuración.

Teniendo esto en cuenta y para los profesionales de SQL, un script preconstruido y reutilizable tiene sentido, de ahí el propósito de este artículo.

Explicación de la plantilla SQL lista para usar

Vayamos al meollo de la cuestión con la pregunta esperada:

Image

Ahora, vamos a explicarlo:

  • En primer lugar, utilizamos CTE - Common Table Expressions (WITH ... ASstatements) para identificar los dos conjuntos data que se van a comparar. De este modo, las siguientes líneas de consulta pueden permanecer inalteradas.

  • A continuación, construimos dos consultas similares con los alias dataset_1_only y dataset_2_only para conservar las filas que sólo están presentes en dataset 1 (frente a dataset 2) y viceversa gracias al operador EXCEPT conjunto.

  • Por último, se define un campo complementario flag para identificar el origen de las filas no coincidentes de ambas consultas. A continuación, éstas se reúnen mediante el operador de conjunto UNION ALL.

Nota: obviamente, disponer de dos conjuntos data con campos comparables es un requisito previo para utilizar la consulta anterior

Ejemplo ilustrado

Basta de teoría, ¡ahora a la práctica! Supongamos que un supermercado quiere recuperar todos los productos elegibles para una promoción en una sola tabla según la semana condiciones de promoción.

Como declaración inicial, consideramos los siguientes productos en stock:

Image

Según las condiciones de promoción de la semana 1:

  • 10% descuento en los estantes de frutas, verduras y hierbas

el dataset_1 es:

Image

En la semana 2, las condiciones de promoción evolucionan a:

  • 10% de descuento en los estantes de frutas y helados

  • 20% descuento en el estante de verduras

  • sin descuento en el estante de hierbas

La evolución de la tubería data genera el dataset_2:

Image

Pero... ¿estamos realmente seguros de los resultados? Las preguntas típicas son:

  • ¿faltan filas o sobran filas?

  • ¿las evoluciones implementadas son correctas en los campos impactados?

  • ¿existe alguna regresión en los campos no afectados?

Nota: aunque parezca fácil responder a las preguntas anteriores de forma intuitiva debido a un ejemplo trivial sobre un pequeño conjunto data, en casos de uso real solemos enfrentarnos a multitud de filas y columnas procedentes de consultas complejas (transformaciones, uniones, agregados, funciones de ventana, ...) dejando que esta consulta adquiera todo su significado

Intentemos responder a las 3 preguntas interpretando los resultados de la consulta comparativa:

Image

Observaciones:

  • Ninguna fila con productos del lineal de frutas: fino como el “10% descuento en frutas” se mantiene sin cambios de la semana 1 a la 2

  • Product_ID #50 (estantería para hierbas) falta en dataset_2 (sólo en dataset_1): fino como el “descuento en hierbas” se detuvo en la segunda semana

  • Product_ID #60 (estantería de helados) falta en dataset_1 (sólo en dataset_2): fino como el “descuento en helados” se introdujo en la semana 2

  • Las filas relativas a Product_ID #30 y #40 (estante de verduras) son divergentes en el campo reduced_price: fino como el “descuento en verduras” aumentó de 10% en la semana 1 a 20% en la semana 2

Finalmente, todo tiene buen aspecto:

  • ¿faltan filas o sobran filas? ¡No!

  • ¿las evoluciones implementadas son correctas en los campos impactados? ¡Sí!

  • ¿existe alguna regresión en los campos no afectados? ¡No!

Consejos y trucos

En CTE, aunque pueda copiar y pegar su consulta SQL de ingestión antes/después de la evolución, podría ser una buena idea almacenar los resultados en tablas temporales para simplificar la comparación, mejorar el rendimiento de la consulta y beneficiarse del almacenamiento en caché si la ejecuta varias veces.

En el mundo real, las divergencias entre dos conjuntos data pueden ser desordenadas. Entonces, clasificación de resultados por clave (la granularidad de los conjuntos data) y bandera puede ayudar enormemente a interpretar y comparar filas equivalentes procedentes de ambos conjuntos data.

Para facilitar las investigaciones e identificar el origen de la brecha, el sospechoso datasets campos comunes pueden eliminarse (es decir, comentarse en CTE) de la comparación: si no hay resultado, significa que todos los campos comparados son iguales. A continuación, puede centrarse sólo en los campos sospechosos restantes para la siguiente comparación y realizarla paso a paso.

Nota: se podría haber realizado un análisis equivalente utilizando la estrategia LEFT JOIN, pero habría sido mucho más difícil de mantener (gestión de NULLs y comparación de campos) y menos eficaz, ya que los operadores de conjuntos son más potentes que los joins.

Resumen

Por lo tanto, esta consulta planificada facilita a los desarrolladores la rápida validación de cambios en complejos conjuntos data. Es útil como complemento de pruebas unitarias más tradicionales, e incluso puede considerarse de forma más general al comparar dos conjuntos data cualesquiera con estructuras similares. Por último, pero no menos importante, ¡la lógica de esta consulta es incluso fácil de aprender de memoria!

Gracias por leer, espero que haya quedado claro y me encantaría conocer su opinión :)

Medio Blog por Artefact.

Este artículo se publicó inicialmente en Medium.com.
¡Síganos en nuestro Medium Blog !