sql >> Base de Datos >  >> RDS >> Mysql

Crear consulta para obtener el recuento de llamadas incompletas

Aquí hay otro método que funciona sin subconsultas correlacionadas o funciones de ventana:

Para cada fila w1 , intenta encontrar otra fila w2 con el mismo call_id y un 0 que indica que la llamada está completa. Usando una UNIÓN EXTERNA IZQUIERDA, podemos probar los casos en los que no w2 fila existe para un call_id dado.

Luego haga otra unión a una fila hipotética w3 con el mismo call_id y un valor menor de ast_num_curr. Nuevamente, usando la unión externa, podemos verificar que no exista tal fila. Esto significa w1 debe tener el valor mínimo para ast num para ese call_id.

SELECT w1.call_id, w1.queue_num_curr
FROM waiter_log AS w1
LEFT OUTER JOIN waiter_log AS w2
  ON w1.call_id = w2.call_id AND w2.proceed_wait = 0 
LEFT OUTER JOIN waiter_log AS w3
  ON w1.call_id = w3.call_id AND w1.ast_num_curr > w3.ast_num_curr
WHERE w2.call_id IS NULL AND w3.call_id IS NULL;

Salida:

+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad |           9004 |
| asdf231 |           9010 |
| rete125 |           9010 |
+---------+----------------+

Para obtener los recuentos por queue_num_curr, envuelva la consulta anterior en una subconsulta de tabla derivada y realice el recuento en la consulta externa:

SELECT queue_num_curr, COUNT(*) AS count
FROM (
  SELECT w1.call_id, w1.queue_num_curr
  FROM waiter_log AS w1
  LEFT OUTER JOIN waiter_log AS w2
    ON w1.call_id = w2.call_id AND w2.proceed_wait = 0
  LEFT OUTER JOIN waiter_log AS w3
    ON w1.call_id = w3.call_id AND w1.ast_num_curr > w3.ast_num_curr
  WHERE w2.call_id IS NULL AND w3.call_id IS NULL
) AS t
GROUP BY queue_num_curr;

Salida:

+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
|           9004 |     1 |
|           9010 |     2 |
+----------------+-------+