求连续出现的数字


title: 求连续出现的数字
date: 2019-10-07 14:11:04
tags:
- MySql
- LeetCode

求连续出现的数字

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

分析:题目的难点在于要连续出现的数字,想到了记录主键的递增,其实这是不保险的,有可能某一行被认为的删除。参考了别人的自连接三次查询,觉得效率也不好,且具有一般性。如果要连续出现100次,难道要自连接100次吗?自连接的方式如下:

SELECT DISTINCT
l1.Num AS ConsecutiveNums
from
Logs l1,
Logs l2,
Logs l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num
AND l2.Num = l3.Num

题解:通过定义用户变量解决这个问题。
定义两个变量a,b,一个记录开始开始的num,判断后续是否相同,如果相同则b+1,满足出现3次的置1,其余全为0 。看代码

select distinct t3.Num as ConsecutiveNums 
from (
select Num,
    if(@a = Num, @b := @b + 1, @b := 1) as count,
    if(@b >= 3, 1, 0)                   as rank,
    @a := Num
from Logs,
    (select @a := 0, @b := 0) t2) t3
where t3.rank = 1

其实这道题收获有俩个,一个是熟悉了定义变量的形式用法,最大的收获是,我发现select是按照行来读取数据的。按行执行。
观察上面的语句,并没有while或者for循环,他是如何达到给num更新值得呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值