Solución
Base de datos
Estrategía 1: Eliminar registros usando NOT IN / EXISTS
Algoritmo
En esta estrategía, eliminaremos las visitas que tienen transacciones directamente usando NOT IN
. Empecemos
por identificar esas visitas. Para este problema, son todos los visit_id
de la tabla Transactions.
SELECT visit_id FROM Transactions
En seguida, en la consulta principal, podemos CONTAR los visit_id
a nivel customer_id
de la tabla Visits
excluyendo las visitas que identificamos en la sub consulta. El valor agregado se agrupa en el nivel del
customer_id
ya que estamos buscando el resultado total para cada cliente. También se cambia el nombre de
esta columna tal y como se solicita en el resultado final.
Implementación
SELECT
customer_id,
COUNT(visit_id) AS count_no_trans
FROM
Visits
WHERE
visit_id NOT IN (
SELECT
visit_id
FROM
Transactions
)
GROUP BY
customer_id
Estrategía 2: Eliminar registros usando LEFT JOIN y IS NULL
Algoritmo
Para este enfoque, queremos excluir las visitas que incluyeron transacciones del conjunto completo de visitas
utilizando LEFT JOIN
. Para ello, tenemos todas las visitas como la tabla izquierda (tabla Visits) para unir
las visitas de la tabla Transactions
en la columna compartida visit_id
. Para eliminar los registros de la
tabla derecha, establecemos su clave como NULL
, por lo que los restos en la tabla Visits son los registros
de las visitas en las que no se produjeron transacciones.
Para obtener el resultado final, queremos CONTAR el número de visitas asociadas a cada customer_id
, y tener
el valor agregado agrupado a nivel de customer_id
. Por último, actualizamos la columna tal y como se
solicita en el enunciado original del problema.
Implementación
SELECT
customer_id,
COUNT(*) AS count_no_trans
FROM
Visits AS v
LEFT JOIN Transactions AS t ON v.visit_id = t.visit_id
WHERE
t.visit_id IS NULL
GROUP BY
customer_id