Oto kolejna metoda, która działa bez skorelowanych podzapytań lub funkcji okna:
Dla każdego wiersza w1
, spróbuj znaleźć inny wiersz w2
z tym samym call_id i 0 wskazującym, że połączenie zostało zakończone. Używając LEFT OUTER JOIN, możemy przetestować przypadki, w których nie ma w2
wiersz istnieje dla danego call_id.
Następnie wykonaj kolejne sprzężenie z hipotetycznym wierszem w3
z tym samym call_id i mniejszą wartością ast_num_curr. Ponownie, używając sprzężenia zewnętrznego, możemy sprawdzić, czy taki wiersz nie istnieje. Oznacza to w1
musi mieć najmniejszą wartość ast num dla tego 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;
Wyjście:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
Aby uzyskać liczniki na liczbę_kolejek_curr, zapakuj powyższe zapytanie w podzapytanie z tabeli pochodnej i wykonaj zliczenie w zapytaniu zewnętrznym:
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;
Wyjście:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+