leetcode180 连续出现的数字 Consecutive Numbers

Posted forever-fortunate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode180 连续出现的数字 Consecutive Numbers相关的知识,希望对你有一定的参考价值。

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

技术图片

 

 

 创建表和数据:

Create table If Not Exists Logs (Id int,Num int);
Truncate table Logs;
insert into Logs (Id, Num) values (1,1);
insert into Logs (Id, Num) values (2,1);
insert into Logs (Id, Num) values (3, 1);
insert into Logs (Id, Num) values (4,2);
insert into Logs (Id, Num) values (5,1);
insert into Logs (Id, Num) values (6,2);
insert into Logs (Id, Num) values (7,2);

解法:

1.题目暗示,每行的id是连续的。因此,表三次自连接,将连续三行且数字都相等行选出来。

SELECT distinct L1.num AS ConsecutiveNums
FROM Logs AS L1
JOIN Logs AS L2 ON (L1.num = L2.num AND L1.id + 1 = L2.id)
JOIN Logs AS L3 ON (L2.num = L3.num AND L2.id + 1 = L3.id)

2.抛开id。仅从行数据考虑,需要用户变量记录前一行数据。当前行数据与前一行数据比较是否相同。

定义两个用户变量

@pre : 前一行数据

@dcnt :与前一行数据连续相同的个数

初始化@pre和@dcnt,定义为一张表:(SELECT @pre:= NULL,@dcnt:=0) AS b

Logs与b叉积,计算出与每行数字连续相同的数字个数。

与前一行数据比较的逻辑为:

@dcnt:= IF(@pre=t.Num, @dcnt+1, 1)

@pre与t.Num : 前一行数据与当前行相同。

如果相同,@dcnt+1,否则@dcnt=1。

这些结果形成一张新表:a(Num,cnt,USELESS)。

最终只要从a中取出cnt大于等于3的行。

SELECT DISTINCT a.Num AS ConsecutiveNums
FROM (
        SELECT 
        l.Num,
        (@dcnt:= IF(@pre=l.Num, @dcnt+1, 1)) AS cnt,
         @pre:=l.NumFROM LOGS as l,(SELECT @pre:= NULL,@dcnt:=0) AS b
) AS a
WHERE a.cnt >= 3;

 

以上是关于leetcode180 连续出现的数字 Consecutive Numbers的主要内容,如果未能解决你的问题,请参考以下文章

SQL屠夫系列leetcode-180. 连续出现的数字-(实战扩展:连续登陆N天)

180. 连续出现的数字

Lc180-连续出现的数字

sql 180. 连续出现的数字

180.Mysql之连续出现的数字

180. 连续出现的数字