Bạn có thể sử dụng các biến để làm điều này.
select phone_number from (
select c.*,
@prev_outcome:[email protected]_outcome,
@cur_outcome:=system_outcome,
@prev_pnum:[email protected]_pnum,
@cur_pnum:=phone_number,
case when @cur_pnum = @prev_pnum and @prev_outcome <> @cur_outcome then @rn:[email protected]+1
when @cur_pnum = @prev_pnum and @prev_outcome = @cur_outcome then @rn:[email protected]
else @rn:=1 end as rank
from calls c,
(select @rn:=0,@prev_pnum:='',@cur_pnum:='',@prev_outcome:='',@cur_outcome:='') r
order by phone_number,dt
) x
where system_outcome='No Answer'
group by phone_number,rank
having count(*) > 6
Truy vấn này sử dụng 4 biến
1) @cur_outcome ban đầu được đặt thành một chuỗi trống. Sau đó, lựa chọn sẽ chỉ định system_outcome của hàng hiện tại.
2) @prev_outcome ban đầu được đặt thành một chuỗi trống. Sau đó, lựa chọn đặt nó thành @cur_outcome (đây là một chuỗi trống lần đầu tiên, v.v.).
3) @cur_pnum ban đầu được đặt thành một chuỗi trống. Sau đó, lựa chọn sẽ chỉ định phone_number của hàng hiện tại.
4) @prev_pnum ban đầu được đặt thành một chuỗi trống. Sau đó, lựa chọn đặt nó thành giá trị @cur_pnum (ban đầu là một chuỗi trống).
order by
ở đây mệnh đề quan trọng để chỉ định các hàng hiện tại và trước đó dựa trên phone_number và ngày tháng.
Ban đầu, hãy chạy truy vấn bên trong để xem cách các biến được đặt, điều này sẽ làm rõ mọi thứ cho bạn.
Bản trình diễn chứa một số dữ liệu mẫu nhiều hơn những gì được hiển thị trong câu hỏi.