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

题目

表:student

Column NameType
idint
numvarchar

id 是这个表的主键。

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

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

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

student 表:

IdNum
11
21
31
42
51
62
72

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去重关键字,因为如果数据是一下的情况,会出现重复的值
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值