sql题---连续出现的数字

题目

表:student

Column Name Type id int num varchar

id 是这个表的主键。

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

返回的结果表中的数据可以按 任意顺序 排列。

查询结果格式如下面的例子所示:

student 表:

Id Num 1 1 2 1 3 1 4 2 5 1 6 2 7 2

Result 表:

ConsecutiveNums 1

1 是唯一连续出现至少三次的数字。

解析

思路

我们想要连续的3个num值都一样的,那么我们可以自连接2次,那么就是三张表,第一张表,从id为1开始,第二张表,id为2开始,第三张表,id为3开始,那么在用表1的num= 表2的num,表2的num=表3的num,便可以得到连续3个num值都一样的数,如果要连续4个,那就自连接3次,4张表,以此类推,如果要将num值去重,那就加DISTINCT

自连接

自连接2次,为三张表

SELECT *
FROM
    student l1,
    student l2,
    student l3

结果共343条数据:7x7x7=343

加条件筛选

SELECT *
FROM
    student l1,
    student l2,
    student l3
WHERE
    l1.Id = l2.Id - 1   ---第一个条件
    AND l2.Id = l3.Id -1   ---第二个条件

第一个条件结果为42条 二个条件结果为5条 为什么会是5条呢,原先是343条(笛卡儿积) 经过第一个条件变为了42条,因为l1.id总共为7个,经过等值运算之后,得出结果为6个,l1表的id为1-6,l2表的id为2-7,去掉了i2表id为1的数据,但是我们还有表3做笛卡儿积运算,6x7=42,则为42条数据 经过第一个条件的拆选之后,l2.id总数为6个,按此基础之上做与l3.id - 1等值运算,得到结果为5个

得到最后的值

SELECT l1.num AS ConsecutiveNums
FROM
    student l1,
    student l2,
    student l3
WHERE
    l1.Id = l2.Id - 1
    AND l2.Id = l3.Id -1
	AND l1.num = l2.num
    AND l2.num = l3.num

加上l1.num = l2.num AND l2.num = l3.num 变可以确定我们想要的哪一行数据,select 做返回字段的筛选,则可以得到我们想要的数据

ps:我们还要注意,要加上DISTINCT去重关键字,因为如果数据是一下的情况,会出现重复的值

经验分享 程序员 微信小程序 职场和发展