Đây là một phương pháp khác hoạt động mà không có truy vấn con hoặc hàm cửa sổ tương quan:
Đối với mỗi hàng w1
, hãy thử tìm một hàng khác w2
có cùng call_id và số 0 cho biết cuộc gọi đã hoàn tất. Sử dụng THAM GIA NGOÀI TRÁI, chúng tôi có thể kiểm tra các trường hợp không có w2
hàng tồn tại cho một call_id nhất định.
Sau đó, thực hiện một phép nối khác với hàng giả định w3
có cùng call_id và giá trị ast_num_curr nhỏ hơn. Một lần nữa, bằng cách sử dụng phép nối bên ngoài, chúng ta có thể kiểm tra xem không có hàng nào như vậy tồn tại. Điều này có nghĩa là w1
phải có giá trị nhỏ nhất cho ast num cho 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;
Đầu ra:
+---------+----------------+
| call_id | queue_num_curr |
+---------+----------------+
| 49c43ad | 9004 |
| asdf231 | 9010 |
| rete125 | 9010 |
+---------+----------------+
Để nhận số lượng trên mỗi queue_num_curr, hãy đặt truy vấn ở trên trong một truy vấn con của bảng dẫn xuất và thực hiện đếm trong truy vấn bên ngoài:
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;
Đầu ra:
+----------------+-------+
| queue_num_curr | count |
+----------------+-------+
| 9004 | 1 |
| 9010 | 2 |
+----------------+-------+