自联结:图解面试题:找出连续出现N次的内容

    技术2022-07-17  77

    猴子数据分析

    图解SQL面试题

    【题目】下面是学生的成绩表(表名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.成绩;

    最终结果:

    【本题考点】

    • 本题考察的是连续出现,会有同学忽略“连续”二字

    • 考察对自关联的灵活应用

    • 从题目连续3次成绩相等,判断出“成绩相等”和“学号连续”这2个条件。考察构建“连续学号成绩相等”的思维构建能力

    【举一反三】

    遇到类似“连续出N次的问题”可以回想本题的解答思路,如:查询至少连续3天没有出勤的员工。

    Processed: 0.010, SQL: 9