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 |
+----------------+-------+