A menudo en la programación SAS©, es necesario cruzar dos conjuntos de datos. Generalmente, usamos una instrucción MERGE en un paso DATA o una unión LEFT/INNER JOIN en SQL a través de una clave común (por ejemplo, un ID de cliente).
Pero, ¿cómo hacerlo cuando las dos tablas no tienen ninguna variable en común y la unión depende de condiciones complejas, como valores comprendidos en intervalos? Esto es lo que se llama una unión no equitativa (Non-Equi Join).
Veamos un caso práctico de una discusión entre usuarios para entender cómo resolver este problema elegantemente con PROC SQL.
La falsa buena idea: el bucle en el paso DATA
Ante este problema, la primera intuición suele ser intentar un enfoque iterativo a través de un paso DATA. La idea sería leer una línea de la tabla accounts, y luego recorrer toda la tabla intervals para encontrar una coincidencia.
Aunque técnicamente es posible, este enfoque es complejo de codificar en SAS©:
Requiere manipular dos punteros de lectura.
Hay que gestionar el reinicio de la lectura de la tabla
intervalspara cada cuenta (lo que puede requerir la opciónPOINT=o múltiples instruccionesSET).El código se vuelve rápidamente pesado y difícil de mantener.
Como señala un colaborador en la discusión: "No perdería tiempo en una metodología de bucle."
La Solución Elegante: PROC SQL y el Producto Cartesiano
La solución más eficaz y legible reside en el uso de PROC SQL. A diferencia del paso DATA, SQL está diseñado para manejar naturalmente las relaciones complejas entre conjuntos sin preocuparse por el orden de clasificación o los bucles explícitos.
El truco consiste en realizar una unión cartesiana (todas las filas de A combinadas con todas las filas de B) y filtrar inmediatamente el resultado.
