sql >> Databáze >  >> RDS >> Mysql

Vytvořte dotaz pro získání počtu nedokončených hovorů

Zde je další metoda, která funguje bez korelovaných poddotazů nebo okenních funkcí:

Pro každý řádek w1 , zkuste najít jiný řádek w2 se stejným call_id a 0 indikující dokončení volání. Pomocí LEFT OUTER JOIN můžeme testovat případy, kdy není w2 řádek pro dané call_id existuje.

Poté proveďte další připojení k hypotetickému řádku w3 se stejným call_id a nižší hodnotou ast_num_curr. Opět pomocí vnějšího spojení můžeme zkontrolovat, že žádný takový řádek neexistuje. To znamená w1 musí mít nejmenší hodnotu pro ast num pro dané 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;

Výstup:

+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad |           9004 |
| asdf231 |           9010 |
| rete125 |           9010 |
+---------+----------------+

Chcete-li získat počty na queue_num_curr, zabalte výše uvedený dotaz do poddotazu odvozené tabulky a proveďte počet ve vnějším dotazu:

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;

Výstup:

+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
|           9004 |     1 |
|           9010 |     2 |
+----------------+-------+


  1. Poddotaz s LIMIT v Doctrine

  2. Přístup k poli v poli PHP

  3. Jak nastavit výchozí znakovou sadu?

  4. Funkce zpoždění / vedení MySQL?