表名称调用
Field 1 - Phone_number Field 2 - System_outcome Phone_number System_outcome DateTime -------------------------------------------------- 07777778999 Answered 18-12-2016 17:15 07777778123 No Answer 18-12-2016 18:10 07777778999 No Answer 19-12-2016 19:30 07777778999 No Answer 19-12-2016 12:15 07777778999 No Answer 19-12-2016 13:15 07777778999 No Answer 20-12-2016 11:15 07777778124 No Answer 20-12-2016 9:15 07777778128 Answered 20-12-2016 17:15 07777778074 Answered 20-12-2016 17:15
上面是一个示例,我需要找出的是如何找到连续无应答计数大于6的数字?
目前,我已经能够获得以下信息,但它不是连续的。
SELECT phone_number,system_outcome,Datetime FROM calls WHERE DATE (datetime) BETWEEN '2016-12-23' AND '2016-12-31' AND system_outcome = 'NO_ANSWER' GROUP BY phone_number HAVING count(Phone_number) > 6
您可以使用变量来执行此操作。
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 子句在这里很重要,以便根据phone_number和date指定当前行和先前行。
order by
最初运行内部查询以查看变量的设置方式,这将为您澄清情况。
Sample Demo
该演示包含的一些示例数据比问题中显示的要多。