Berikut metode lain yang berfungsi tanpa subkueri atau fungsi jendela yang berkorelasi:
Untuk setiap baris w1
, coba cari baris lain w2
dengan call_id yang sama dan 0 menunjukkan panggilan selesai. Menggunakan LEFT OUTER JOIN, kita dapat menguji kasus di mana tidak ada w2
baris ada untuk call_id tertentu.
Kemudian lakukan join lagi ke baris hipotetis w3
dengan call_id yang sama dan nilai ast_num_curr yang lebih rendah. Sekali lagi, menggunakan gabungan luar, kita dapat memeriksa bahwa tidak ada baris seperti itu. Ini berarti w1
harus memiliki nilai ast num terkecil untuk call_id tersebut.
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;
Keluaran:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
Untuk mendapatkan hitungan per queue_num_curr, bungkus kueri di atas dalam subkueri tabel turunan, dan lakukan penghitungan di kueri luar:
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;
Keluaran:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+