Question:
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
解法一:利用变量(执行用时:186 ms)
思路:
(1)对相同的数字进行分组并赋值自增列;
(2)如果数字和前面的数字一样,则自增加1,如果不一样,则从1开始计数;
(3)取出自增列中数值为3的的对应的数num,相应的数字1有可能在后面会再次出现并连续大于3次,则这里用distinct num.
select distinct Num as ConsecutiveNums
from
(select Num,
if(Num = @pre_num, @count:=@count+1, @count:=1) as count1,
@pre_num := Num
from
(select @count:=1, @pre_num := null) a,Logs b) a
where count1 = 3;
解法二:利用自连接(执行用时:287 ms)
思路:
(1)对三张表进行联结;
(2)条件是a表与b表的id-1有关联,b表与c表的id-1有关联,及第一个id分别于第二个id和第三个id都有关联,并且有关联的这三个id对应的num都相同,然后取出该num。
SELECT DISTINCT l1.Num consecutivenums FROM Logs l1, Logs l2, Logs l3
WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num AND l2.Num = l3.Num;