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;