您可以使用变量来执行此操作。
select phone_number from (
select c.*,
@prev_outcome:=@cur_outcome,
@cur_outcome:=system_outcome,
@prev_pnum:=@cur_pnum,
@cur_pnum:=phone_number,
case when @cur_pnum = @prev_pnum and @prev_outcome <> @cur_outcome then @rn:=@rn+1
when @cur_pnum = @prev_pnum and @prev_outcome = @cur_outcome then @rn:=@rn
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
此查询使用 4 个变量
1) @cur_outcome 最初设置为空字符串。此后,选择分配当前行的system_outcome。
2) @prev_outcome 最初设置为空字符串。此后,选择将其设置为@cur_outcome(第一次是空字符串,依此类推)。
3) @cur_pnum 最初设置为空字符串。此后,选择分配当前行的phone_number。
4) @prev_pnum 最初设置为空字符串。此后,选择将其设置为 @cur_pnum 值(最初是一个空字符串)。
order by
子句在这里很重要,可以根据电话号码和日期指定当前行和前一行。
最初运行内部查询以查看变量是如何设置的,这将为您澄清事情。
Sample Demo
该演示包含的示例数据比问题中显示的要多。