查询连续出现的数字次数为3的num

#连续出现的数字次数3
Mysql
#变量使用方式 @pre :=赋值
select distinct num from
(select Num,
case
when @prev = Num then @count := @count + 1
when (@prev := Num) is not null then @count := 1
end as CNT
from Logs,(select @prev:=0,@count:=1 ) temp) temp1 where cnt>=3

#解析:
id num
1 1
2 1
3 1
4 2
5 1
6 2
7 2
## 数据库查询方式一次查询多条,case when 中从第一条开始判断,直到结束

1.case when 中的顺序问题: 满足第一个条件时直接退出 否则继续查询是否满足第二条件
2.当查询时,先执行第一个when ,@prev=num 表示@prev 是否等于num ,等于时 计数加+1
3.第二个when,当前面满足@prev 不等于num ,则将num 赋值给@prev 且不为空,表示 如果num为空 跳过 , 那么计数@count 赋值1 重新计数
4.(select @prev:=0,@count:=1 ) temp 通过子查询初始化变量

解法二:

SELECT
num
FROM
(
SELECT
num,
( cast( DENSE_RANK() over ( PARTITION BY num ORDER BY id ASC ) AS signed ) - id ) AS rn
FROM
LOGS
) t1
GROUP BY
rn,
num
HAVING
count( rn )>= 3

#解析:
1.dense_rank根据num 分组 order by id 得到 rn
id num rn
1 1 1
2 1 2
3 1 3
5 1 4
4 2 1
6 2 2
7 2 3

连续时,id-rn 的得到的值一样
最后分组 id-rn 使用 having count >=3得到num
# mysql默认数字相减为负数报错 使用 cast(字段 as signed) 表示有符号的数字

posted @   春夏秋冬zz  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示