筛选一段时间内给同一手机号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
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