查找值连续相同N次的行值(@,case when,distinct)——Mysql练习

leetcode180连续出现的数字
(以下的值全为英文字符,中文冒号比较显眼,所以才在文中使用中文冒号)

前置知识点

@value:= null 表示为变量value赋值
是的,@xx表示一个变量,:=表示赋值

(select @valueA:=null,@valueB:=null)as t 给多个变量赋值

distinct 去重值,如果查询的列里的值有重复,那只输出一次

case when 相当于平常的switch函数了,基本语法如下

SELECT
	sex as '性别',
	CASE sex
		WHEN sex='女' THEN
			'女子团体'
		WHEN '男' THEN
			'男子团体'
		ELSE
			'无'
	END as '所属项目'
FROM
	paticipator;

需要注意的是,如果判断语句不是一个判断,而是一个值,那么默认是判断是否与case的值相等,
而且判断语句的相等用的是一个=,不是==。

回到题目

找出行的Num值连续相等次数超过2的

Logs 表:
+----+-----+
| Id | Num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+

Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

我们先定义两个变量,一个记录上一行的值,一个记录当前累计的相同值的次数,初始值都为空

(select @pre := null,@count := null) as t

然后根据Num值,构造一列,专门记录与上一行相同的累计次数

select Num,
case 
when @pre=Num then @count:=@count+1
when (@pre:=Num) is not null then @count:=1
end as CNT
from Logs

Logs 表:
+----+-----+-----+
| Id | Num | CNT |	 
+----+-----+-----+
| 1  | 1   | 1   |
| 2  | 1   | 2   |
| 3  | 1   | 3   |
| 4  | 2   | 1   |
| 5  | 1   | 1   |
| 6  | 2   | 1   |
| 7  | 2   | 2   |
+----+-----+-----+

只取右边两行

最后查找CNT大于等于3的去重行值

完整代码如下

select distinct Num as ConsecutiveNums from
(
select Num,
case 
when @pre=Num then @count:=@count+1
when (@pre:=Num) is not null then @count:=1
end as CNT 
from Logs,
(select @pre := null,@count := null) as t
) as temp 
where temp.CNT >= 3

这题还是有局限性的,只是求值,如果求满足的所有的行的其他信息就歇菜了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rgbhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值