小编典典

带计数的SQL连续记录

sql

表名称调用

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

阅读 154

收藏
2021-04-14

共1个答案

小编典典

您可以使用变量来执行此操作。

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指定当前行和先前行。

最初运行内部查询以查看变量的设置方式,这将为您澄清情况。

Sample Demo

该演示包含的一些示例数据比问题中显示的要多。

2021-04-14