Voici une autre méthode qui fonctionne sans sous-requêtes ni fonctions de fenêtre corrélées :
Pour chaque ligne w1
, essayez de trouver une autre ligne w2
avec le même call_id et un 0 indiquant que l'appel est terminé. En utilisant un LEFT OUTER JOIN, nous pouvons tester les cas où aucun w2
ligne existe pour un call_id donné.
Ensuite, faites une autre jointure à une ligne hypothétique w3
avec le même call_id et une valeur ast_num_curr moindre. Encore une fois, en utilisant une jointure externe, nous pouvons vérifier qu'aucune ligne de ce type n'existe. Cela signifie w1
doit avoir la plus petite valeur pour ast num pour ce 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;
Sortie :
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
Pour obtenir les décomptes par queue_num_curr, encapsulez la requête ci-dessus dans une sous-requête de table dérivée et effectuez le décompte dans la requête externe :
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;
Sortie :
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+