Problema: Según las habilidades requeridas, hacer la selección de candidatos usando SQL
En muchos procesos de selección, un rol exige un conjunto específico de habilidades. Esa lista define el estándar mínimo para desempeñar la función y marca la diferencia entre un candidato potencial y uno verdaderamente apto. Aun así, cada persona llega con una combinación distinta de conocimientos: algunos dominan solo lo esencial, otros acumulan experiencia diversa y unos pocos cumplen casi todo sin excepción. En este contexto, la selección de candidatos usando SQL se convierte en una herramienta especialmente valiosa, porque ofrece una forma estructurada y consistente de interpretar estas variaciones.
En ese escenario, el desafío no consiste en identificar candidatos con habilidades aisladas, sino en determinar con precisión quién cumple el 100% de los requisitos que un rol demanda. Lo he enfrentado al menos dos veces en mi trabajo como consultor, y en ambos casos la conclusión fue la misma: la solución debe ser escalable, clara y consistente. Cuando el número de candidatos y posiciones crece, cualquier revisión manual se vuelve insostenible, y es allí donde un enfoque estructurado en SQL marca la diferencia.
Este problema aparece en:
- Recursos Humanos
- HR Analytics
- Data Engineering
- Sistemas de recomendación
- Evaluación de competencias
- Auditorías de cumplimiento
SQL ofrece una solución elegante y general para este escenario: la división relacional, un patrón clásico para resolver el caso “must have all”.
Modelo de datos: requisitos para la selección de candidatos usando SQL
Para mantener el ejemplo limpio y reproducible, usaremos CTEs en lugar de crear tablas.
CANDIDATE_SKILLS: Habilidades por candidato
WITH CANDIDATE_SKILLS AS (
SELECT * FROM (VALUES
('Ann', 'maths'),
('Ann', 'chemistry'),
('John', 'maths'),
('John', 'physics'),
('Lewis', 'maths'),
('Lewis', 'chemistry'),
('Lewis', 'physics')
) AS t(candidate, skill)
),
ROLE_REQUIREMENTS: Habilidades requeridas por rol
ROLE_REQUIREMENTS AS (
SELECT * FROM (VALUES
('astronaut', 'maths'),
('astronaut', 'chemistry'),
('engineer', 'maths'),
('scientist', 'maths'),
('scientist', 'chemistry'),
('scientist', 'physics')
) AS t(role, skill)
)
Concepto Clave: División Relacional
Para que un candidato sea apto para un rol, debe cumplir todas las habilidades requeridas.
La lógica es simple:
- Contar cuántas habilidades requiere un rol.
- Contar cuántas de esas habilidades tiene un candidato.
- Si ambos conteos coinciden → el candidato es apto.
- Ordenar la salida para facilitar la interpretación de los datos.
Este patrón es conocido como división relacional, y es una de las formas más limpias de resolver el caso “must have all” en SQL.
Solución SQL: Identificar candidatos aptos para cada rol
Aquí está la consulta general, sin filtrar por ningún rol:
-- Step 1: Join candidates with the skills required by each role
SELECT
cs.candidate,
rr.role
FROM ROLE_REQUIREMENTS rr
JOIN CANDIDATE_SKILLS cs
ON cs.skill = rr.skill
-- Step 2: Group by candidate and role to count matched skills
GROUP BY
cs.candidate,
rr.role
-- Step 3: Compare the number of matched skills with the total required skills
HAVING
COUNT(DISTINCT rr.skill) =
(
SELECT COUNT(DISTINCT skill)
FROM ROLE_REQUIREMENTS rr2
WHERE rr2.role = rr.role
)
-- Final ordering for readability
ORDER BY 2, 1;
Explicación breve
- JOIN: une habilidades requeridas con habilidades del candidato.
- GROUP BY: agrupa por candidato y rol.
- HAVING: compara cuántas habilidades del rol tiene el candidato.
- Subquery correlacionada: obtiene el total de habilidades requeridas por cada rol.
Resultados: candidatos que cumplen todos los requisitos
| candidate | role |
|---|---|
| Ann | astronaut |
| Lewis | astronaut |
| Ann | engineer |
| John | engineer |
| Lewis | engineer |
| Lewis | scientist |
Interpretación
- Ann aparece como candidata fuerte en astronaut y engineer.
- John cumple únicamente los requisitos de engineer.
- Lewis es el único que cumple los tres requisitos del rol scientist.
Este patrón funciona igual para miles de candidatos y roles.
Interpretación empresarial: como aplicar la selección de candidatos usando SQL
Esta técnica permite:
- Automatizar la validación de requisitos.
- Reducir errores manuales en procesos de selección.
- Integrar análisis de habilidades en pipelines de HR Analytics.
- Construir dashboards de cumplimiento de competencias.
- Evaluar candidatos de forma objetiva y reproducible.
Es un enfoque ideal para organizaciones que manejan grandes volúmenes de talento y roles.
Extensiones: mejoras y variantes del modelo en SQL
Puede usarse este enfoque para:
- Mostrar qué le falta a cada candidato.
- Calcular el porcentaje de requisitos cumplidos.
- Detectar inconsistencias en roles.
- Integrar pesos o niveles de habilidad.
- Optimizar para millones de filas.
Estos puntos quedan abiertos para que el lector los desarrolle como ejercicios.
Conclusión: SQL como herramienta para selección basada en habilidades
La selección basada en habilidades es un proceso crítico en cualquier organización, y SQL ofrece una solución clara, elegante y escalable para identificar candidatos aptos según los requisitos de cada rol. La verdadera fortaleza aparece cuando incorporamos un patrón poco conocido y decisivo: la división relacional, que permite comparar de forma estructurada lo exigido por un rol con lo que cada candidato aporta.
Al aplicar este enfoque, obtenemos un mecanismo objetivo, reproducible, escalable y claro. Incluso cuando el número de candidatos y posiciones crece, la división relacional mantiene la precisión y la simplicidad del análisis, ofreciendo una base sólida para tomar decisiones relacionadas con el reclutamiento.
Puede descargar el script comentado en este enlace.


