leetcode180 连续出现的数字 Consecutive Numbers

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

 

 

 建立表和数据:3d

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');

解法:code

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

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。仅从行数据考虑,须要用户变量记录前一行数据。当前行数据与前一行数据比较是否相同。table

定义两个用户变量class

@pre : 前一行数据变量

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

初始化@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;
相关文章
相关标签/搜索