mysql 记录连续问题

mysql 记录连续问题

最近碰到一个sql问题:要求连续三天及以上,并且每天人流量均不少于100

mysql> select * from t_people_stat;
+----+------------+--------+
| id | start_date | people |
+----+------------+--------+
|  1 | 2019-04-03 |    100 |
|  3 | 2019-04-04 |     90 |
|  4 | 2019-04-05 |     80 |
|  5 | 2019-04-06 |    105 |
|  6 | 2019-04-07 |    109 |
|  7 | 2019-04-09 |    100 |
|  8 | 2019-04-10 |     70 |
+----+------------+--------+
7 rows in set (0.13 sec)

解决思路

  • 过滤掉人流量<100的记录
  • 生成虚拟的自增长列gid
  • 用mysql数据库中自增长的id减去虚拟的自增长的列gid,即(id-gid) as diff,构造成等差数列
  • 如果diff相同,则说明是连续的

实现

这里还用到了FIND_IN_SETGROUP_CONCAT函数,注意:GROUP_CONCAT默认最长为1024个字节

SELECT
	tps.*
FROM
	t_people_stat tps,
(SELECT
	tps.id,
	tps.start_date,
	tps.people,
	( tps.id - tps.gid ) diff,
	GROUP_CONCAT(tps.id ORDER BY tps.id) ids,
	GROUP_CONCAT(tps.people) peoples
FROM
	( SELECT tps.*, @a := @a + 1 gid FROM t_people_stat tps, ( SELECT @a := 0 ) AS t WHERE tps.people >= 100) tps
GROUP BY diff HAVING count(id) >= 3)tpss
WHERE
FIND_IN_SET(tps.id,tpss.ids)

输出结果:

+----+------------+--------+
| id | start_date | people |
+----+------------+--------+
|  5 | 2019-04-06 |    105 |
|  6 | 2019-04-07 |    109 |
|  7 | 2019-04-09 |    100 |
+----+------------+--------+
3 rows in set (0.06 sec)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值