Hier ist eine andere Methode, die ohne korrelierte Unterabfragen oder Fensterfunktionen funktioniert:
Für jede Zeile w1
, versuchen Sie, eine andere Zeile w2
zu finden mit derselben call_id und einer 0, die angibt, dass der Anruf abgeschlossen ist. Mit einem LEFT OUTER JOIN können wir auf Fälle testen, in denen kein w2
vorhanden ist Zeile existiert für eine gegebene call_id.
Führen Sie dann eine weitere Verknüpfung mit einer hypothetischen Zeile w3
durch mit derselben call_id und einem geringeren ast_num_curr-Wert. Auch hier können wir mithilfe von Outer Join überprüfen, ob keine solche Zeile vorhanden ist. Das bedeutet w1
muss den kleinsten Wert für ast num für diese call_id haben.
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;
Ausgabe:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
Um die Anzahl pro queue_num_curr zu erhalten, packen Sie die obige Abfrage in eine abgeleitete Tabellen-Unterabfrage und führen Sie die Zählung in der äußeren Abfrage durch:
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;
Ausgabe:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+