标题: 查询连续出现的数字次数为3的num [打印本页] 作者: 王國慶 时间: 2022-8-11 21:09 标题: 查询连续出现的数字次数为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) 表示有符号的数字