2022-11-25:连续出现的数字。编写一个 SQL 查询,查找所有至少连续出现三次的数字

2022-11-25:连续出现的数字。编写一个 SQL 查询,查找所有至少连续出现三次的数字。
答案是输出1,原因是1是唯一连续出现三次的数字。

DROP TABLE IF EXISTS logs;
CREATE TABLE logs (
  id int(11) NOT NULL,
  num int(11) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO logs VALUES ('1', '1');
INSERT INTO logs VALUES ('2', '1');
INSERT INTO logs VALUES ('3', '1');
INSERT INTO logs VALUES ('4', '2');
INSERT INTO logs VALUES ('5', '1');
INSERT INTO logs VALUES ('6', '2');
INSERT INTO logs VALUES ('7', '2');

答案2022-11-25:

sql语句如下:




































SELECT DISTINCT
    l1.num AS 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

执行结果如下:

在这里插入图片描述

本作品采用《CC 协议》,转载必须注明作者和本文链接
微信公众号:福大大架构师每日一题。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。
讨论数量: 2

每日一问,为嘛不用 LAG() 窗口函数呢?

感觉会比两次联表快

1年前 评论
白小二

力扣的原题,最佳解答:

    select 
        distinct Num as ConsecutiveNums 
    from  
        (select Num,
                if(@pre=Num,@count := @count+1,@count := 1) as nums,
                @pre:=Num
            from logs as l ,
                (select @pre:= null,@count:=1) as pc
        ) as n
    where nums >=3;

这里是增加了个两个临时变量用作运算,逻辑性比较强,而且开销小。写起来不会乱,举个简单的例子,如果是连续10次,这种写法优势就很大,又比如想知道每个数字最多连续出现的次数,也只需要稍微改一下即可

最高连续出现次数:

    select 
        Num,
      max(nums) as ConsecutiveNums 
    from  
        (select Num,
                if(@pre=Num,@count := @count+1,@count := 1) as nums,
                @pre:=Num
            from logs as l ,
                (select @pre:= null,@count:=1) as pc
        ) as n
    GROUP BY Num
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
470
粉丝
21
喜欢
37
收藏
22
排名:457
访问:1.9 万
私信
所有博文
社区赞助商