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;

 

posted @ 2019-10-22 21:37  forever_fortunate  阅读(258)  评论(0编辑  收藏  举报