Mysql
 sql >> Base de données >  >> RDS >> Mysql

Créer une requête pour obtenir le nombre d'appels inachevés

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