Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Criar consulta para obter a contagem de chamadas não concluídas


Aqui está outro método que funciona sem subconsultas ou funções de janela correlacionadas:

Para cada linha w1 , tente encontrar outra linha w2 com o mesmo call_id e um 0 indicando que a chamada foi concluída. Usando um LEFT OUTER JOIN, podemos testar os casos em que não há w2 existe uma linha para um determinado call_id.

Em seguida, faça outra junção a uma linha hipotética w3 com o mesmo call_id e um valor de ast_num_curr menor. Novamente, usando a junção externa, podemos verificar se essa linha não existe. Isso significa w1 deve ter o menor valor para ast num para esse 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;

Saída:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad |           9004 |
| asdf231 |           9010 |
| rete125 |           9010 |
+---------+----------------+

Para obter as contagens por queue_num_curr, envolva a consulta acima em uma subconsulta de tabela derivada e faça a contagem na 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;

Saída:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
|           9004 |     1 |
|           9010 |     2 |
+----------------+-------+