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更新值得呢?