Ето друг метод, който работи без корелирани подзаявки или прозоречни функции:
За всеки ред w1
, опитайте да намерите друг ред w2
със същия call_id и 0, което показва, че повикването е завършено. Използвайки LEFT OUTER JOIN, можем да тестваме за случаи, когато няма w2
ред съществува за даден call_id.
След това направете още едно присъединяване към хипотетичен ред w3
със същия call_id и по-малка стойност ast_num_curr. Отново, използвайки външно присъединяване, можем да проверим дали такъв ред не съществува. Това означава w1
трябва да има най-ниската стойност за ast num за този 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;
Изход:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
За да получите броя на queue_num_curr, увийте заявката по-горе в подзаявка на производна таблица и направете броя във външната заявка:
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;
Изход:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+