码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode180 连续出现的数字 Consecutive Numbers

时间:2019-10-22 22:10:29      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:查找   int   rom   一个   前一行   ber   bsp   create   数据   

编写一个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

标签:查找   int   rom   一个   前一行   ber   bsp   create   数据   

原文地址:https://www.cnblogs.com/forever-fortunate/p/11722746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!