SQL面试题——找出连续出现N次的内容(扩展连续登陆用户)

        下面是学生的成绩表(表名score,列名:学号、成绩),使用SQL查找所有至少连续出现3次的成绩。

例如,“成绩”这一列里84是连续出现3次的成绩。

【解题思路】

1.条件1:什么是连续出现3次?

假设“学号”是按顺序排列的(如果不是,可以增加一列,这一列是按序号顺序排列的),所以每一学号与上一学号相差1。例如下图的3个学号是连续学号,他们之间的关系是:

某一学号(0002)=下一位的学号(0003)-1

下一位学号(0003)=下下位学号(0004)-1

2.条件2:成绩相等

如果这3个连续学号的成绩相等,就是题目要求的“至少连续出现3次的成绩”。

3.利用“自关联“的思路

自连接(自身连接)的本质是把一张表复制出多张一模一样的表来使用。SQL语法:


select 列明 
from 表名 as 别名1,表名 as 别名2;

 步骤1)将成绩表(score)复制3个一样的表,分别命名为a、b、c

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

步骤2)我们需要找到这3个表中3个连续的学号,这个条件如下

a.学号 = b.学号-1 and b.学号 = c.学号-1

步骤3)还要让这3个学号连续的人“成绩相等”,这个条件如下

a.成绩 = b.成绩 and b.成绩 = c.成绩 

将步骤2和步骤3的条件合并起来就是下面SQL里的where字句:


select *
from score as a,
   score as b,
   score as c;
 where a.学号 = b.学号 - 1
   and b.学号 = c.学号 - 1
   and a.成绩 = b.成绩
   and b.成绩 = c.成绩;

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


select distinct a.成绩 as 最终答案
from score as a,
   score as b,
   score as c;
 where a.学号 = b.学号 - 1
   and b.学号 = c.学号 - 1
   and a.成绩 = b.成绩
   and b.成绩 = c.成绩;

 

 转载与公众号:猴子数据分析

相关扩展:连续登陆三天的用户

https://www.jb51.net/article/245788.htm

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值