每日一题-4(找出连续出现的数字)

题4:

根据下表,编写一个SQL查询,查找所有至少连续出现三次的数字,返回的值可以任意排列。
在这里插入图片描述
方法一:窗口函数
本题考察的是连续出现,从题目连续3次数字相等,判断出“数字相等"和"Id连续"这2个条件。考察构建"连续Id数字相等"的思维构建能力
使用的函数:

  • 向上窗口函数lead:取出字段名所在的列,向上N行的数据,作为独立的列,代码lead(字段名,N,默认值) over(partion by …order by …)
  • 向下窗口函数lag:取出字段名所在的列,向下N行的数据,作为独立的列,代码lag(字段名,N,默认值) over(partion by …order by …)
    其中,默认值是指,当向上N行或者向下N行值时,如果已经超出了表行和列的范围时,会将这个默认值作为函数的返回值,若没有指定默认值,则返回Null。
select distinct Num as ConsecutiveNums 
from(
    select Num ,
           lag(Num,1) over(order by Id) as Num1,
           lag(Num,2) over(order by Id) as Num2
    from Logs) t
where (t.Num = t.Num1 and t.Num1 = t.Num2);

方法二:自链接
1、先理解什么是连续出现3次,根据这个题而言Id如果是按顺序排列(如果不是,可以使用增加一列,让Id是按序号顺序排列的),所以每个Id与上一个Id相差1;
2、如果这3个连续Id的数字相等,就是题目要求的"至少连续出现3次的数字"。
3、利用"自连接(自身连接)"的思路,其思想就是把一张表复制出多张一模一样的表来使用。
具体步骤如下:
第一步:将Logs表复制3分,分别命名为a、b、c

select *
from Logs as a,
   Logs as b,
   Logs as c;

第二步:我们需要找到这3个表中3个连续的Id,这个条件如下a.Id = b.Id -1 and b.Id = c.Id -1
第三步:还要让这3个学号连续的人“数字相等",这个条件如下a.Num=b.Num and bNum=c.Num

select *
from Logs as a,
   Logs as b,
   Logs as c
 where a.Id = b.Id - 1
   and b.Id = c.Id - 1
   and a.Num = b.Num
   and b.Num = c.Num;

第四步:前面步骤已经将连续3人相等的数字找出,现在用distinct去掉自连接产生的重复数。最终SQL如下:

select distinct a.Num as ConsecutiveNums
from Logs as a,
   Logs as b,
   Logs as c
 where a.Id = b.Id - 1
   and b.Id = c.Id - 1
   and a.Num = b.Num
   and b.Num = c.Num;

猜你喜欢

转载自blog.csdn.net/Txixi/article/details/121189008