Här är en annan metod som fungerar utan korrelerade underfrågor eller fönsterfunktioner:
För varje rad w1
, försök att hitta en annan rad w2
med samma call_id och en 0 som indikerar att samtalet är klart. Genom att använda en LEFT OUTER JOIN kan vi testa för fall där ingen w2
rad finns för ett givet call_id.
Gör sedan en ny koppling till en hypotetisk rad w3
med samma call_id och ett lägre ast_num_curr-värde. Återigen, med hjälp av yttre koppling, kan vi kontrollera att det inte finns någon sådan rad. Detta betyder w1
måste ha det minsta värdet för ast num för det 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;
Utdata:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
För att få antalet per queue_num_curr, slå in frågan ovan i en härledd tabell-underfråga och gör räkningen i den yttre frågan:
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;
Utdata:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+