筛选一段时间内给同一手机号三分钟内重复发送信息的次数

筛选一段时间内给同一手机号X分钟内重复发送信息的次数

例:筛选2022年12月7日,给同一手机号在3分钟内重复发送信息的次数
数据现状
手机号 发送时间
手机号1 202212061320
手机号1 202212071320
手机号1 202212071322
手机号1 202212071325
手机号1 202212071330
手机号2 202212071324
手机号2 202212071321
手机号3 202212071325
手机号3 202212071326

期望结果 7

亲测有效

select 
tel_num ,count(*) num
from (
select 
a.tel_num,a.send_time,TimeStampDiff(minute,a.send_time,b.send_time) cz
from (
select tel_num,
cast(concat_ws(' ',
concat_ws('-',substr(send_time,1,4),substr(send_time,5,2),substr(send_time,7,2)),
concat_ws(':',substr(send_time,9,2),substr(send_time,11,2),'00')
) as datetime) send_time
from test.csdn ) a
join 
(
select tel_num,
cast(concat_ws(' ',
concat_ws('-',substr(send_time,1,4),substr(send_time,5,2),substr(send_time,7,2)),
concat_ws(':',substr(send_time,9,2),substr(send_time,11,2),'00')
) as datetime) send_time
from test.csdn ) b 
on a.tel_num = b.tel_num 
) a where cz >0 and cz <=3
and cast(send_time as date) = '2022-12-07'
group by tel_num 

img

https://juejin.cn/post/6844903518160027662

和这个例子相似 把里面的七天替换成你的三分钟,最近七天,最近三分钟

select count(*) from 表名 where 发送时间 between ‘2022-12-07 03:00:00’ and ‘2022-12-07 03:03:00’ and 手机号=手机号1

SELECT phone, COUNT(*)
FROM messages
WHERE send_time >= '2022-12-07 00:00:00' AND send_time < '2022-12-08 00:00:00'
GROUP BY phone
HAVING COUNT(*) > 1

需求存在描叙不清楚的位置
比如: 一个手机号在 5分钟内 收到 n 条信息,这种情况也只统计 3分钟吗


SELECT COUNT(1) FROM 表名 WHERE 发送时间 BEWTEEN '202212061320' AND '202212061323' AND 手机号=手机号1

 既然千万级别数据  你有索引扫描会很快的 如果给确定的哪个3分钟 就直接count() 是很快能扫描出来的 
  如果是要计算一天中每一个三分钟的话 那还是建议使用作业的方式提前算好 放进一个数据表中

7代表总和吗? 用mysql实现? 第二列日期串类型是什么?

##按手机号排序后,错位相减后判断时间差



select count(*)+count(distinct a.手机号) ct
from 
(select *,ROW_NUMBER() over (PARTITION by 手机号 order by 发送时间) rw
from test1
where substr(发送时间,1,8)='20221207') a 
join 
(select *,ROW_NUMBER() over (PARTITION by 手机号 order by 发送时间) rw
from test1
where substr(发送时间,1,8)='20221207') b 
on a.手机号=b.手机号 and a.rw+1=b.rw

where TIMESTAMPDIFF(MINUTE,concat(a.发送时间,"00"),concat(b.发送时间,"00"))<=3


img

img