Mysql
 sql >> Database >  >> RDS >> Mysql

Crea query per ottenere il conteggio delle chiamate non completate

Ecco un altro metodo che funziona senza sottoquery o funzioni della finestra correlate:

Per ogni riga w1 , prova a trovare un'altra riga w2 con lo stesso call_id e uno 0 che indica che la chiamata è completa. Usando un LEFT OUTER JOIN, possiamo testare i casi in cui nessun w2 esiste una riga per un dato call_id.

Quindi esegui un altro join a un'ipotetica riga w3 con lo stesso call_id e un valore ast_num_curr minore. Ancora una volta, usando outer join, possiamo verificare che non esista una riga di questo tipo. Questo significa w1 deve avere il valore minimo per ast num per quel 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;

Uscita:

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

Per ottenere i conteggi per queue_num_curr, avvolgi la query sopra in una sottoquery di tabella derivata ed esegui il conteggio nella query esterna:

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;

Uscita:

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